"Cannot read property 'get' of undefined" 当将对象数组添加到变异 react-graphql-apollo-mongoose 时

"Cannot read property 'get' of undefined" when add array of objects to mutation react-graphql-apollo-mongoose

只有当我将 product 对象数组添加到突变时,我才得到 "Cannot read property 'get' of undefined" 错误,如果我只添加 orderId Int 则没有错误。以下是更多信息:

架构

type Order {
    orderId: Int
    product: [ProductInput]
}

input ProductInput {
    prodId: String
    value: [ValueInput]
}

type Product {
    prodId: String
    value: [Value]
}

type Value{
    name:String,
    props:String
}

input ValueInput{
    name:String,
    props:String
}

突变

 addOrder(orderId: Int, product: [ProductInput]):Order

解析器(带猫鼬)

 addOrder(parent, args, context, info) {
 let orderId;
 let product;

 if (args.orderId) {
      orderId = { orderId: args.orderId };
      }
 if (args.product) {
      product= { product: args.product};
      }

return context.Order.findOneAndUpdate(
      { orderId: args.orderId },
      {
        $setOnInsert: {
          ...orderId,
          ...product
        }
      },
      { new: true, upsert: true }
    );
}

即使出现错误,数据库中的变异也成功了,但是 graphql return

{
  "errors": [
    {
      "message": "Cannot read property 'get' of undefined",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "addOrder"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "TypeError: Cannot read property 'get' of undefined",
            "    at EmbeddedDocument.<anonymous> (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\schema.js:1824:23)",
            "    at VirtualType.applyGetters (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\virtualtype.js:137:25)",
            "    at EmbeddedDocument.Document.get (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\document.js:1508:19)",
            "    at applyVirtuals (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\document.js:3246:20)",
            "    at EmbeddedDocument.Document.$toObject (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\document.js:2986:5)",
            "    at EmbeddedDocument.Document.toObject (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\document.js:3169:15)",
            "    at DocumentArrayPath.cast (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\schema\documentarray.js:401:27)",
            "    at DocumentArrayPath.SchemaType.applySetters (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\schematype.js:1010:12)",
            "    at DocumentArrayPath.SchemaType._castForQuery (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\schematype.js:1424:15)",
            "    at DocumentArrayPath.SchemaType.castForQueryWrapper (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\schematype.js:1391:17)",
            "    at castUpdateVal (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\helpers\query\castUpdate.js:515:19)",
            "    at walkUpdatePath (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\helpers\query\castUpdate.js:342:22)",
            "    at castUpdate (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\helpers\query\castUpdate.js:99:18)",
            "    at model.Query._castUpdate (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\query.js:4481:10)",
            "    at castDoc (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\query.js:4509:18)",
            "    at model.Query.Query._findAndModify (C:\Users\mihai\Desktop\Projects\ECOM\BACKEND\node_modules\mongoose\lib\query.js:3472:22)"
          ]
        }
      }
    }
  ],
  "data": {
    "addOrder": null
  }
}

第一个

Mutation

 addOrder(orderId: Int, product: [ProductInput]):Order

突变addOrder应该returnOrder对象

findOneAndUpdate 方法插入一条新记录,但 returning 结果是可选的 - 它可以使用 returnNewDocument: true 完成(默认值:false) - 请参阅 docs

第二

如果您要插入 nested/embeded 个实体 - ProductInput 数组 - 您也需要 insert/create 它们 - 请参阅 - 当然这取决于 mongoose 模式(你没有'提供)。

使用 graphql 解析器和 'wrap' 比 adapt/change 猫鼬模式更容易反映 grpahql types/resolver 变化。

感谢@xadm,我通过替换解析器解决了错误:

 if (args.product) {
      product= { product: args.product};
      }

if (args.product) {
      product = args.product.map((product) => {
        return {
          'product.prodId': product.prodId,
          'product.variation': product.variation.map((variation) => {
            return {
              'product.variation.name': variation.name,
              'product.variation.value': variation.value
            };
          })
        };
      });
    }