Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to save arrays in a Json type field #2432

Closed
jwld opened this issue May 13, 2020 · 7 comments · Fixed by #2596
Closed

Unable to save arrays in a Json type field #2432

jwld opened this issue May 13, 2020 · 7 comments · Fixed by #2596
Assignees
Labels
bug/2-confirmed Bug has been reproduced and confirmed. kind/bug A reported bug. tech/typescript Issue for tech TypeScript. topic: Json Scalar type `Json`
Milestone

Comments

@jwld
Copy link

jwld commented May 13, 2020

Bug description

Trying to create something with a Json field, but when I submit an array it throws an error.

How to reproduce

  • Create a model with a Json field
  • Call create on that model, passing it an array for the field
model Service {
  id       Int  @default(autoincrement()) @id
  formula  Json
}

Error 1

const newService = await prisma.service.create({
  data: { formula: [] }
})
Value types mismatch. Have: List([]), want: Scalar(Json)` at `.Mutation.createOneService.data.ServiceCreateInput.formula

Error 2

const newService = await prisma.service.create({
  data: { formula: [{ test: 'test' }] }
})
Parse error at 10:9
Unexpected `"test"[StringValue]`
Expected `Name`, `:` or `}`

Expected behavior

Ability to save arrays of objects as Json, as in prisma 1.

Prisma information

Environment & setup

  • OS: Mac OS
  • Database: PostgreSQL
  • Prisma version: 2.0.0-beta.5
  • Node.js version: v13.13.0
@jwld jwld mentioned this issue May 13, 2020
@jonthewayne
Copy link

we're currently experiencing the same issue on mysql db, same prisma version.

@pantharshit00
Copy link
Contributor

I can confirm this behavior in 2.0.0-alpha.1208. Thanks for reporting!

@pantharshit00 pantharshit00 added bug/2-confirmed Bug has been reproduced and confirmed. kind/bug A reported bug. topic: Json Scalar type `Json` labels May 14, 2020
@timsuchanek timsuchanek self-assigned this May 14, 2020
@Jolg42 Jolg42 added the tech/typescript Issue for tech TypeScript. label May 22, 2020
@janpio janpio added this to the Beta 7 milestone May 26, 2020
@Jolg42
Copy link
Member

Jolg42 commented May 28, 2020

For this schema

 datasource db {
      provider = "postgres"
      url      = env("DATABASE_URL")
    }
      
    generator client {
      provider = "prisma-client-js"
    }

    model Service {
      id       Int  @default(autoincrement()) @id
      formula  Json
    }

The dmmf returned is

{
  datamodel: {
    enums: [],
    models: [
      {
        name: 'Service',
        isEmbedded: false,
        dbName: null,
        fields: [
          {
            name: 'id',
            kind: 'scalar',
            isList: false,
            isRequired: true,
            isUnique: false,
            isId: true,
            isReadOnly: false,
            type: 'Int',
            hasDefaultValue: true,
            isGenerated: false,
            isUpdatedAt: false
          },
          {
            name: 'formula',
            kind: 'scalar',
            isList: false,
            isRequired: true,
            isUnique: false,
            isId: false,
            isReadOnly: false,
            type: 'Json',
            hasDefaultValue: false,
            isGenerated: false,
            isUpdatedAt: false
          }
        ],
        isGenerated: false,
        idFields: [],
        uniqueFields: []
      }
    ]
  },
  schema: {
    rootQueryType: 'Query',
    rootMutationType: 'Mutation',
    inputTypes: [
      {
        name: 'ServiceWhereInput',
        fields: [
          {
            name: 'AND',
            inputType: {
              type: 'ServiceWhereInput',
              kind: 'object',
              isRequired: false,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'OR',
            inputType: {
              type: 'ServiceWhereInput',
              kind: 'object',
              isRequired: false,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'NOT',
            inputType: {
              type: 'ServiceWhereInput',
              kind: 'object',
              isRequired: false,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'id',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'id_not',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'id_in',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'id_not_in',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'id_lt',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'id_lte',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'id_gt',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'id_gte',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'formula',
            inputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'formula_not',
            inputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'ServiceWhereUniqueInput',
        fields: [
          {
            name: 'id',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'ServiceCreateInput',
        fields: [
          {
            name: 'formula',
            inputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'ServiceUpdateInput',
        fields: [
          {
            name: 'id',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'formula',
            inputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'ServiceUpdateManyMutationInput',
        fields: [
          {
            name: 'id',
            inputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'formula',
            inputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          }
        ]
      }
    ],
    outputTypes: [
      {
        name: 'Service',
        fields: [
          {
            name: 'id',
            args: [],
            outputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'formula',
            args: [],
            outputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'AggregateService',
        fields: [
          {
            name: 'count',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'orderBy',
                inputType: {
                  type: 'ServiceOrderByInput',
                  kind: 'enum',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'skip',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'after',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'before',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'first',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'last',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'Query',
        fields: [
          {
            name: 'findManyService',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'orderBy',
                inputType: {
                  type: 'ServiceOrderByInput',
                  kind: 'enum',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'skip',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'after',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'before',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'first',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'last',
                inputType: {
                  type: 'Int',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: true,
              isList: true,
              isNullable: false
            }
          },
          {
            name: 'aggregateService',
            args: [],
            outputType: {
              type: 'AggregateService',
              kind: 'object',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'findOneService',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'BatchPayload',
        fields: [
          {
            name: 'count',
            args: [],
            outputType: {
              type: 'Int',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          }
        ]
      },
      {
        name: 'Mutation',
        fields: [
          {
            name: 'createOneService',
            args: [
              {
                name: 'data',
                inputType: {
                  type: 'ServiceCreateInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'deleteOneService',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'updateOneService',
            args: [
              {
                name: 'data',
                inputType: {
                  type: 'ServiceUpdateInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: false,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'upsertOneService',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereUniqueInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'create',
                inputType: {
                  type: 'ServiceCreateInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'update',
                inputType: {
                  type: 'ServiceUpdateInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Service',
              kind: 'object',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'updateManyService',
            args: [
              {
                name: 'data',
                inputType: {
                  type: 'ServiceUpdateManyMutationInput',
                  kind: 'object',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'BatchPayload',
              kind: 'object',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'deleteManyService',
            args: [
              {
                name: 'where',
                inputType: {
                  type: 'ServiceWhereInput',
                  kind: 'object',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'BatchPayload',
              kind: 'object',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          },
          {
            name: 'executeRaw',
            args: [
              {
                name: 'query',
                inputType: {
                  type: 'String',
                  kind: 'scalar',
                  isRequired: true,
                  isList: false,
                  isNullable: false
                }
              },
              {
                name: 'parameters',
                inputType: {
                  type: 'Json',
                  kind: 'scalar',
                  isRequired: false,
                  isList: false,
                  isNullable: false
                }
              }
            ],
            outputType: {
              type: 'Json',
              kind: 'scalar',
              isRequired: true,
              isList: false,
              isNullable: false
            }
          }
        ]
      }
    ],
    enums: [
      {
        name: 'ServiceOrderByInput',
        values: [ 'id_ASC', 'id_DESC', 'formula_ASC', 'formula_DESC' ]
      }
    ]
  },
  mappings: [
    {
      model: 'Service',
      aggregate: 'aggregateService',
      createOne: 'createOneService',
      deleteMany: 'deleteManyService',
      deleteOne: 'deleteOneService',
      findMany: 'findManyService',
      findOne: 'findOneService',
      updateMany: 'updateManyService',
      updateOne: 'updateOneService',
      upsertOne: 'upsertOneService'
    }
  ]
}

It looks like formula is of type Json here, the problem is probably in the client then.

@Jolg42
Copy link
Member

Jolg42 commented May 28, 2020

Error 1

const newService = await prisma.service.create({
  data: { formula: [] }
})
prisma-client Client Version 2.0.0-alpha.1261 +0ms
  prisma-client Engine Version 455a3cf6bd2bc9dcb5069289187fe4f01d0047c9 +1ms
  prisma-client {
  prisma-client   engineConfig: {
  prisma-client     cwd: '/Users/j42/Dev/repro/repro-2432-json-array-type/prisma',
  prisma-client     debug: false,
  prisma-client     datamodelPath: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/schema.prisma',
  prisma-client     prismaPath: undefined,
  prisma-client     generator: {
  prisma-client       name: 'client',
  prisma-client       provider: 'prisma-client-js',
  prisma-client       output: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client',
  prisma-client       binaryTargets: [],
  prisma-client       config: {}
  prisma-client     },
  prisma-client     showColors: false,
  prisma-client     logLevel: undefined,
  prisma-client     logQueries: undefined,
  prisma-client     flags: [],
  prisma-client     clientVersion: '2.0.0-alpha.1261'
  prisma-client   }
  prisma-client } +0ms
  prisma-client Prisma Client call: +87ms
  prisma-client prisma.service.create({
  prisma-client   data: {
  prisma-client     formula: []
  prisma-client   }
  prisma-client }) +1ms
  prisma-client Generated request: +0ms
  prisma-client mutation {
  prisma-client   createOneService(data: {
  prisma-client     formula: []
  prisma-client   }) {
  prisma-client     id
  prisma-client     formula
  prisma-client   }
  prisma-client }
  prisma-client  +0ms
  engine { cwd: '/Users/j42/Dev/repro/repro-2432-json-array-type/prisma' } +0ms
  engine {
  engine   dotPrismaPath: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/query-engine-darwin'
  engine } +0ms
  plusX Execution permissions of /Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/query-engine-darwin are fine +0ms
  engine { flags: [ '--enable-raw-queries' ] } +1ms
  engine stderr Printing to stderr for debugging +19ms
  engine stderr Listening on 127.0.0.1:60667 +1ms
  engine stdout {
  timestamp: 'May 28 15:53:03.676',
  level: 'INFO',
  target: 'quaint::pooled',
  fields: { message: 'Starting a postgresql pool with 13 connections.' }
} +0ms
  engine stdout {
  timestamp: 'May 28 15:53:03.681',
  level: 'INFO',
  target: 'query_engine::server',
  fields: { message: 'Started http server on 127.0.0.1:60667' }
} +5ms
  engine {
  engine   error: PrismaClientKnownRequestError: Failed to validate the query `Error occurred during query validation & transformation:
  engine   Mutation (object)
  engine     ↳ createOneService (field)
  engine       ↳ data (argument)
  engine         ↳ ServiceCreateInput (object)
  engine           ↳ formula (field)
  engine             ↳ Value types mismatch. Have: List([]), want: Scalar(Json)` at `.Mutation.createOneService.data.ServiceCreateInput.formula`
  engine       at NodeEngine.graphQLToJSError (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/engine-core/dist/NodeEngine.js:626:1)
  engine       at /Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/engine-core/dist/NodeEngine.js:581:1
  engine       at process.elapsed (internal/process/task_queues.js:94:5)
  engine       at PrismaClientFetcher.request (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:661:21)
  engine       at main (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:23) {
  engine     code: 'P2009',
  engine     meta: {
  engine       query_validation_error: 'Error occurred during query validation & transformation:\n' +
  engine         'Mutation (object)\n' +
  engine         '  ↳ createOneService (field)\n' +
  engine         '    ↳ data (argument)\n' +
  engine         '      ↳ ServiceCreateInput (object)\n' +
  engine         '        ↳ formula (field)\n' +
  engine         '          ↳ Value types mismatch. Have: List([]), want: Scalar(Json)',
  engine       query_position: '.Mutation.createOneService.data.ServiceCreateInput.formula'
  engine     }
  engine   }
  engine } +16ms
  printStack callsite Error: 
    at Object.model [as Service] (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:425:46)
    at Object.n.<computed> [as create] (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:553:33)
    at main (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:44)
    at Object.<anonymous> (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:14:1)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Module.m._compile (/Users/j42/.fnm/node-versions/v12.14.1/installation/lib/node_modules/ts-node/src/index.ts:814:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/j42/.fnm/node-versions/v12.14.1/installation/lib/node_modules/ts-node/src/index.ts:817:12)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14) +0ms
(node:83199) UnhandledPromiseRejectionWarning: Error: 
Invalid `client.service.create()` invocation in
/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:44

  2 
  3 async function main() {
  4   const client = new PrismaClient();
  5 
→ 6   const newService1 = await client.service.create(
  Failed to validate the query `Error occurred during query validation & transformation:
Mutation (object)
  ↳ createOneService (field)
    ↳ data (argument)
      ↳ ServiceCreateInput (object)
        ↳ formula (field)
          ↳ Value types mismatch. Have: List([]), want: Scalar(Json)` at `.Mutation.createOneService.data.ServiceCreateInput.formula`
    at PrismaClientFetcher.request (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:689:15)
    at processTicksAndRejections (internal/process/task_queues.js:94:5)
(node:83199) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:83199) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Error 2

const newService = await prisma.service.create({
  data: { formula: [{ test: 'test' }] }
})
prisma-client Client Version 2.0.0-alpha.1261 +0ms
  prisma-client Engine Version 455a3cf6bd2bc9dcb5069289187fe4f01d0047c9 +2ms
  prisma-client {
  prisma-client   engineConfig: {
  prisma-client     cwd: '/Users/j42/Dev/repro/repro-2432-json-array-type/prisma',
  prisma-client     debug: false,
  prisma-client     datamodelPath: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/schema.prisma',
  prisma-client     prismaPath: undefined,
  prisma-client     generator: {
  prisma-client       name: 'client',
  prisma-client       provider: 'prisma-client-js',
  prisma-client       output: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client',
  prisma-client       binaryTargets: [],
  prisma-client       config: {}
  prisma-client     },
  prisma-client     showColors: false,
  prisma-client     logLevel: undefined,
  prisma-client     logQueries: undefined,
  prisma-client     flags: [],
  prisma-client     clientVersion: '2.0.0-alpha.1261'
  prisma-client   }
  prisma-client } +0ms
  prisma-client Prisma Client call: +84ms
  prisma-client prisma.service.create({
  prisma-client   data: {
  prisma-client     formula: [
  prisma-client       {
  prisma-client         test: 'test'
  prisma-client       }
  prisma-client     ]
  prisma-client   }
  prisma-client }) +0ms
  prisma-client Generated request: +1ms
  prisma-client mutation {
  prisma-client   createOneService(data: {
  prisma-client     formula: [
  prisma-client       {
  prisma-client         "test": "test"
  prisma-client       }
  prisma-client     ]
  prisma-client   }) {
  prisma-client     id
  prisma-client     formula
  prisma-client   }
  prisma-client }
  prisma-client  +0ms
  engine { cwd: '/Users/j42/Dev/repro/repro-2432-json-array-type/prisma' } +0ms
  engine {
  engine   dotPrismaPath: '/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/query-engine-darwin'
  engine } +0ms
  plusX Execution permissions of /Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/.prisma/client/query-engine-darwin are fine +0ms
  engine { flags: [ '--enable-raw-queries' ] } +1ms
  engine stderr Printing to stderr for debugging +20ms
  engine stderr Listening on 127.0.0.1:60672 +0ms
  engine stdout {
  timestamp: 'May 28 15:53:40.954',
  level: 'INFO',
  target: 'quaint::pooled',
  fields: { message: 'Starting a postgresql pool with 13 connections.' }
} +1ms
  engine stdout {
  timestamp: 'May 28 15:53:40.959',
  level: 'INFO',
  target: 'query_engine::server',
  fields: { message: 'Started http server on 127.0.0.1:60672' }
} +4ms
  engine {
  engine   error: PrismaClientUnknownRequestError: Error parsing GraphQL query: query parse error: Parse error at 5:9
  engine   Unexpected `"test"[StringValue]`
  engine   Expected `Name`, `:` or `}`
  engine   
  engine       at NodeEngine.graphQLToJSError (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/engine-core/dist/NodeEngine.js:628:1)
  engine       at /Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/engine-core/dist/NodeEngine.js:581:1
  engine       at process.elapsed (internal/process/task_queues.js:94:5)
  engine       at PrismaClientFetcher.request (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:661:21)
  engine       at main (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:23)
  engine } +10ms
  printStack callsite Error: 
    at Object.model [as Service] (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:425:46)
    at Object.n.<computed> [as create] (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:553:33)
    at main (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:44)
    at Object.<anonymous> (/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:14:1)
    at Module._compile (internal/modules/cjs/loader.js:955:30)
    at Module.m._compile (/Users/j42/.fnm/node-versions/v12.14.1/installation/lib/node_modules/ts-node/src/index.ts:814:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:991:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/j42/.fnm/node-versions/v12.14.1/installation/lib/node_modules/ts-node/src/index.ts:817:12)
    at Module.load (internal/modules/cjs/loader.js:811:32)
    at Function.Module._load (internal/modules/cjs/loader.js:723:14) +0ms
(node:83223) UnhandledPromiseRejectionWarning: Error: 
Invalid `client.service.create()` invocation in
/Users/j42/Dev/repro/repro-2432-json-array-type/main.ts:6:44

  2 
  3 async function main() {
  4   const client = new PrismaClient();
  5 
→ 6   const newService2 = await client.service.create(
  Error parsing GraphQL query: query parse error: Parse error at 5:9
Unexpected `"test"[StringValue]`
Expected `Name`, `:` or `}`

    at PrismaClientFetcher.request (/Users/j42/Dev/repro/repro-2432-json-array-type/node_modules/@prisma/client/src/runtime/getPrismaClient.ts:693:15)
    at processTicksAndRejections (internal/process/task_queues.js:94:5)
(node:83223) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:83223) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

https://prisma-company.slack.com/archives/C4GCG53BP/p1590674136290400

@AnandChowdhary
Copy link

@timsuchanek I'm still seeing this, using v2.6.0:

Invalid `prisma.accessTokens.update()` invocation in
/Users/anandchowdhary/Projects/staart/api/dist/src/_staart/rest/user.js:272:45

  Failed to validate the query `Error occurred during query validation & transformation:
Mutation (object)
  ↳ updateOneaccessTokens (field)
    ↳ data (argument)
      ↳ accessTokensUpdateInput (object)
        ↳ scopes (field)
          ↳ Value types mismatch. Have: String("[\"p, user-1, user-1, read:users/info\",\"p, user-1, user-1, write:users/info\",\"p, user-1, user-1, read:users/access-tokens\"]"), want: Object((Weak))` at `.Mutation.updateOneaccessTokens.data.accessTokensUpdateInput.scopes`

In this example, scopes is correctly an array of strings.

@lohazo
Copy link

lohazo commented Sep 3, 2020

Failed to validate the query `Error occurred during query validation & transformation:
Mutation (object)
  ↳ upsertOneLeaderBoard (field)
    ↳ update (argument)
      ↳ LeaderBoardUpdateInput (object)
        ↳ main_wallets (field)
          ↳ Value types mismatch. Have: String("[]"), want: Object((Weak))` at `.Mutation.upsertOneLeaderBoard.update.LeaderBoardUpdateInput.main_wallets`

Don't know why my array is converted to String("[]")
Im using 2.6.0

@Jolg42
Copy link
Member

Jolg42 commented Sep 3, 2020

@AnandChowdhary @lohazo Indeed please track this new issue for the fix coming soon in 2.6.1 #3503

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug/2-confirmed Bug has been reproduced and confirmed. kind/bug A reported bug. tech/typescript Issue for tech TypeScript. topic: Json Scalar type `Json`
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants