"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
};
})
};
});
}
只有当我将 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 它们 - 请参阅
使用 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
};
})
};
});
}