【问题标题】:TypeError: Cannot read propety of undefined. GraphQL Mutation with Apollo Server and SequelizeTypeError:无法读取未定义的属性。使用 Apollo Server 和 Sequelize 进行 GraphQL 突变
【发布时间】:2020-01-16 07:20:39
【问题描述】:

这是我第一次尝试 GraphQl,我在操场上遇到了这个错误:

{
  "errors": [
    {
      "message": "TypeError: Cannot read property 'PaymentInfo' of undefined",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createCreditCard"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "Error: TypeError: Cannot read property 'PaymentInfo' of undefined",
            "    at _callee3$ (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:18:23)",
            "    at tryCatch (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/regenerator-runtime/runtime.js:62:40)",
            "    at Generator.invoke [as _invoke] (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/regenerator-runtime/runtime.js:288:22)",
            "    at Generator.prototype.(anonymous function) [as next] (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/regenerator-runtime/runtime.js:114:21)",
            "    at asyncGeneratorStep (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:8:103)",
            "    at _next (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:10:194)",
            "    at /Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:10:364",
            "    at new Promise (<anonymous>)",
            "    at /Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:10:97",
            "    at createCreditCard (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/src/resolvers/payment.js:11:25)",
            "    at field.resolve (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql-extensions/src/index.ts:274:18)",
            "    at resolveFieldValueOrError (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:467:18)",
            "    at resolveField (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:434:16)",
            "    at /Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:244:18",
            "    at /Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/jsutils/promiseReduce.js:23:10",
            "    at Array.reduce (<anonymous>)",
            "    at promiseReduce (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/jsutils/promiseReduce.js:20:17)",
            "    at executeFieldsSerially (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:241:37)",
            "    at executeOperation (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:219:55)",
            "    at executeImpl (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:104:14)",
            "    at Object.execute (/Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/graphql/execution/execute.js:64:35)",
            "    at /Users/milano/Documents/Projects/mtg-shop-v1/mtg-shop-server/node_modules/apollo-server-core/src/requestPipeline.ts:464:30"
          ]
        }
      }
    }
  ],
  "data": null
}

我只想在我的数据库(我正在使用 postgres)上使用 Playground 创建一个新的“PaymentInfo”。

我的突变:

  mutation {
    createCreditCard(cvv: 165, cardNumber: 123654376, isValid: true) {
      id
    }
  }

我的解析器:

    Mutation: {
        createCreditCard: async (parent, { me, models }) => {
            try {
                return await models.PaymentInfo.create({
                    paymentInfos,
                    userId: me.id,
                });
            } catch (error) {
                throw new Error(error);
            }
        },

我的架构:

    createCreditCard(
      cardNumber: Int!
      cvv: Int!
      isValid: Boolean!
    ): PaymentInfo!
    deleteCreditCard(id: ID!): Boolean!
  }

没有加起来的是,我可以通过代码 (https://sequelize.org/master/manual/getting-started.html#querying) 使用 sequelize 查询创建任何东西,但是在操场上使用突变时,我根本做不到。

我确定我在操场上的突变语法上做错了,但我不知道是什么。

谢谢

【问题讨论】:

    标签: javascript graphql sequelize.js


    【解决方案1】:

    您的解析器似乎有问题。 Graphql 解析器被传递了四个参数 - obj, args, context, info。我猜{ me, models } 是试图解构您的上下文,但可能存在问题,因为您没有考虑或访问中间的 args 对象,您需要访问 createCreditCard 变量(实际上,不是查看定义 paymentInfos 的位置)。或许可以尝试以下方法:

       Mutation: {
            createCreditCard: async (parent, args, { me, models }) => {
                try {
                    const paymentInfos = { ...args };
                    console.log(paymentInfos); // confirm you are passing object of correct shape to db
                    return await models.PaymentInfo.create({
                        paymentInfos,
                        userId: me.id,
                    });
                } catch (error) {
                    throw new Error(error);
                }
            },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2022-01-12
      • 2021-11-08
      • 2021-02-07
      • 2019-10-22
      • 2021-07-20
      • 2016-12-11
      相关资源
      最近更新 更多