首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“无法读取未定义的属性'get‘”当将对象数组添加到突变反应时-graphql-阿波罗-猫鼬

“无法读取未定义的属性'get‘”当将对象数组添加到突变反应时-graphql-阿波罗-猫鼬
EN

Stack Overflow用户
提问于 2020-03-09 09:33:34
回答 2查看 1K关注 0票数 0

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

模式

代码语言:javascript
复制
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
}

突变

代码语言:javascript
复制
 addOrder(orderId: Int, product: [ProductInput]):Order

救生器(用猫鼬)

代码语言:javascript
复制
 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返回

代码语言:javascript
复制
{
  "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
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-09 09:54:52

第一

突变

代码语言:javascript
复制
 addOrder(orderId: Int, product: [ProductInput]):Order

addOrder 应返回 Order 对象

findOneAndUpdate方法插入一个新记录,但返回结果是可选的-它可以使用returnNewDocument: true (默认值:false)来完成-参见文档

第二

如果要插入嵌套/嵌入式实体-- ProductInput数组--您也需要插入/创建它们--参见略微相关的问题 --当然它取决于猫鼬模式(您没有提供)。

让mongose部件工作并使用graphql解析器“包装”要比调整/更改蒙戈模式来反映grpahql类型/解析器更改要容易。

票数 1
EN

Stack Overflow用户

发布于 2020-03-09 11:10:13

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

代码语言:javascript
复制
 if (args.product) {
      product= { product: args.product};
      }

使用

代码语言:javascript
复制
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
            };
          })
        };
      });
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60597781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档