I followed this tutorial from DigitalOcean on how to create a prisma GraphQL API. https://www.digitalocean.com/community/tutorials/how-to-build-a-graphql-api-with-prisma-and-deploy-to-digitalocean-s-app-platform
The App is accessing the PostgreSQL database hosted on digitalOcean and everything is working fine. Now I would like to add the field "test" to the "Post" model: TypeDefs:
type Post {
content: String
id: ID!
published: Boolean!
title: String!
author: User
test: String
}
Resolver:
Mutation: {
createMeme: (parent, args) => {
return prisma.post.create({
data: {
title: args.title,
content: args.content,
published: args.published,
author: args.authorEmail && {
connect: { email: args.authorEmail },
},
test: args.test,
},
})
},
Mutation:
type Mutation {
createMeme(authorEmail: String, content: String, title: String!, published: Boolean, test: String): Post!
}
Model in schema.prisma file:
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
test String?
}
When I migrate it to my local PostgreSQL database hosted on docker it is working fine, here is what I do:
- Change DATABASE_URL in .env file to local database
- Execute: "npm prisma migrate dev"
- "npm start"
When I now try to change DATABASE_URL to my PostgreSQL Database hosted on digitalOcean I do the following:
- "git add ."
- "git commit -m "test field added""
- "git push"
- "npx prisma migrate deploy"
In this case I got the following error: Error: P3018
A migration failed to apply. New migrations cannot be applied before the error is recovered from. Read more about how to resolve migration issues in a production database:
I fixed it with "npx prisma migrate reset"
When I now try to excecute the following query against my PostgreSQL database hosted on digital ocean:
mutation{
createMeme(title: "Help", content: "Hellp", published: true, test: "Test") {
id
title
content
published
test
}
}
I get the following error:
{"errors": [
{
"message": "\nInvalid `prisma.post.create()` invocation in\n/workspace/src/schema.js:61:26\n\n 58 },\n 59 Mutation: {\n 60 createMeme: (parent, args) => {\nā 61 return prisma.post.create({\n data: {\n title: 'Help',\n content: 'Hellp',\n published: true,\n author: undefined,\n test: 'Test'\n ~~~~\n }\n })\n\nUnknown arg `test` in data.test for type PostCreateInput. Did you mean `title`? Available args:\ntype PostCreateInput {\n title: String\n content?: String | Null\n published?: Boolean\n author?: UserCreateNestedOneWithoutPostsInput\n}\n\n",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"createMeme"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"clientVersion": "3.6.0",
"stacktrace": [
"Error: ",
"Invalid `prisma.post.create()` invocation in",
"/workspace/src/schema.js:61:26",
"",
" 58 },",
" 59 Mutation: {",
" 60 createMeme: (parent, args) => {",
"ā 61 return prisma.post.create({",
" data: {",
" title: 'Help',",
" content: 'Hellp',",
" published: true,",
" author: undefined,",
" test: 'Test'",
" ~~~~",
" }",
" })",
"",
"Unknown arg `test` in data.test for type PostCreateInput. Did you mean `title`? Available args:",
"type PostCreateInput {",
" title: String",
" content?: String | Null",
" published?: Boolean",
" author?: UserCreateNestedOneWithoutPostsInput",
"}",
"",
"",
" at Object.validate (/workspace/node_modules/@prisma/client/runtime/index.js:34750:20)",
" at PrismaClient._executeRequest (/workspace/node_modules/@prisma/client/runtime/index.js:39729:17)",
" at consumer (/workspace/node_modules/@prisma/client/runtime/index.js:39670:23)",
" at /workspace/node_modules/@prisma/client/runtime/index.js:39674:49",
" at AsyncResource.runInAsyncScope (async_hooks.js:189:9)",
" at PrismaClient._request (/workspace/node_modules/@prisma/client/runtime/index.js:39674:27)",
" at request (/workspace/node_modules/@prisma/client/runtime/index.js:39779:77)",
" at _callback (/workspace/node_modules/@prisma/client/runtime/index.js:39987:14)",
" at PrismaPromise.then (/workspace/node_modules/@prisma/client/runtime/index.js:39994:23)",
" at resolveField (/workspace/node_modules/graphql/execution/execute.js:468:26)"
]
}
}
}
],
"data": null
}
Such a weird behaviour, why is it working on my localhost but not on the digitalocean hosted db? Am I missing some steps in the terminal? Maybe some commands to execute?
Here is the whole schema.js file with all resolvers, typeDefs etc:
const { gql } = require('apollo-server')
const { prisma } = require('./db')
const typeDefs = gql`
type User {
email: String!
id: ID!
name: String
posts: [Post!]!
}
type Post {
content: String
id: ID!
published: Boolean!
title: String!
author: User
test: String
}
type Query {
feed: [Post!]!
post(id: ID!): Post
}
type Mutation {
createUser(data: UserCreateInput!): User!
createMeme(authorEmail: String, content: String, title: String!, published: Boolean, test: String): Post!
publish(id: ID!): Post
}
input UserCreateInput {
email: String!
name: String
posts: [PostCreateWithoutAuthorInput!]
}
input PostCreateWithoutAuthorInput {
content: String
published: Boolean
title: String!
}
`
const resolvers = {
Query: {
feed: (parent, args) => {
return prisma.post.findMany({
where: { published: true },
})
},
post: (parent, args) => {
return prisma.post.findOne({
where: { id: Number(args.id) },
})
},
},
Mutation: {
createMeme: (parent, args) => {
return prisma.post.create({
data: {
title: args.title,
content: args.content,
published: args.published,
author: args.authorEmail && {
connect: { email: args.authorEmail },
},
test: args.test,
},
})
},
publish: (parent, args) => {
return prisma.post.update({
where: { id: Number(args.id) },
data: {
published: true,
},
})
},
createUser: (parent, args) => {
return prisma.user.create({
data: {
email: args.data.email,
name: args.data.name,
posts: {
create: args.data.posts,
},
},
})
},
},
User: {
posts: (parent, args) => {
return prisma.user
.findOne({
where: { id: parent.id },
})
.posts()
},
},
Post: {
author: (parent, args) => {
return prisma.post
.findOne({
where: { id: parent.id },
})
.author()
},
},
}
module.exports = {
resolvers,
typeDefs,
}
Here is the project on GitHub: https://github.com/DaFaack/prisma-graphql.git
The only files in my .gitignore are node_modules and .env
