MongoDB Stitch GraphQL 自定义突变解析器返回 null
MongoDB Stitch GraphQL Custom Mutation Resolver returning null
GraphQL 是 MongoDB Stitch 的新功能,我知道它处于测试阶段,因此提前感谢您的帮助。我很高兴直接在 Stitch 中使用 GraphQL,所以我希望我可能只是忽略了一些东西。
return Payload 的 documentation 显示了 bsonType 的使用,但是当实际输入 JSON 有效负载类型的架构时,它要求您使用 "type" 而不是 "bsonType"。它仍然可以使用 "bsonType" 对我来说这很奇怪,只要至少有一个属性使用 "type".
函数如下:
const mongodb = context.services.get("mongodb-atlas");
const collection = mongodb.db("<database>").collection("<collection>");
const query = { _id: BSON.ObjectId(input.id) }
const update = {
"$push": {
"notes": {
"createdBy": context.user.id,
"createdAt": new Date,
"text": input.text
}
}
};
const options = { returnNewDocument: true }
collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
if(updatedDocument) {
console.log(`Successfully updated document: ${updatedDocument}.`)
} else {
console.log("No document matches the provided query.")
}
return {
_id: updatedDocument._id,
notes: updatedDocument.notes
}
})
.catch(err => console.error(`Failed to find and update document: ${err}`))
}
这是客户解析器中的输入类型:
"type": "object",
"title": "AddNoteToLeadInput",
"required": [
"id",
"text"
],
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
以下是负载类型:
{
"type": "object",
"title": "AddNoteToLeadPayload",
"properties": {
"_id": {
"type": "objectId"
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"createdAt": {
"type": "string"
},
"createdBy": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
}
}
}
输入错误时 "type" 错误状态:
Expected valid values are:[array boolean integer number null object string]
输入错误时 "bsonType" 错误状态:
Expected valid values are:[string object array objectId boolean bool null regex date timestamp int long decimal double number binData]
我已经尝试了所有我能想到的组合,包括将所有 "bsonType" 更改为 "type"。我还尝试在使用 "type" 时将 _id 更改为字符串,或在 "bsonType" 时将 objectId 更改为字符串。无论我在使用突变时尝试什么组合,它都会按照预期的方式将注释添加到前导中,但 return 有效负载始终显示为空。我需要它 return _id 并注意它会在前端更新 Apollo 中的 InMemoryCache。
您好 Bernard – 目前自定义解析器表单 UI 中存在一个不幸的错误,它不允许您仅在 input/payload 类型中使用 bsonType – 我们正在努力解决这个。实际上,只要它们与您的数据一致,您就应该能够使用 type/bsonType 或两者的混合。我认为你想要的负载类型定义很可能是:
{
"type": "object",
"title": "AddNoteToLeadPayload",
"properties": {
"_id": {
"bsonType": "objectId"
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"createdAt": {
"bsonType": "date"
},
"createdBy": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
}
}
}
如果这不起作用,向我们提供您希望返回的数据示例可能会有所帮助。
我注意到您在致电 collection.findOneAndUpdate()
之前可能漏掉了一个 return
我尝试了这个函数(与你的类似)并将 GraphiQL 设置为 return 值(所有输入和有效负载类型都为 String
)
exports = function(input){
const mongodb = context.services.get("mongodb-atlas");
const collection = mongodb.db("todo").collection("dreams");
const query = { _id: input.id }
const update = {
"$push": {
"notes": {
"createdBy": context.user.id,
"createdAt": "6/10/10/10",
"text": input.text
}
}
};
const options = { returnNewDocument: true }
return collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
if(updatedDocument) {
console.log(`Successfully updated document: ${updatedDocument}.`)
} else {
console.log("No document matches the provided query.")
}
return {
_id: updatedDocument._id,
notes: updatedDocument.notes
}
})
.catch(err => console.error(`Failed to find and update document: ${err}`))
}
GraphQL 是 MongoDB Stitch 的新功能,我知道它处于测试阶段,因此提前感谢您的帮助。我很高兴直接在 Stitch 中使用 GraphQL,所以我希望我可能只是忽略了一些东西。
return Payload 的 documentation 显示了 bsonType 的使用,但是当实际输入 JSON 有效负载类型的架构时,它要求您使用 "type" 而不是 "bsonType"。它仍然可以使用 "bsonType" 对我来说这很奇怪,只要至少有一个属性使用 "type".
函数如下:
const mongodb = context.services.get("mongodb-atlas");
const collection = mongodb.db("<database>").collection("<collection>");
const query = { _id: BSON.ObjectId(input.id) }
const update = {
"$push": {
"notes": {
"createdBy": context.user.id,
"createdAt": new Date,
"text": input.text
}
}
};
const options = { returnNewDocument: true }
collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
if(updatedDocument) {
console.log(`Successfully updated document: ${updatedDocument}.`)
} else {
console.log("No document matches the provided query.")
}
return {
_id: updatedDocument._id,
notes: updatedDocument.notes
}
})
.catch(err => console.error(`Failed to find and update document: ${err}`))
}
这是客户解析器中的输入类型:
"type": "object",
"title": "AddNoteToLeadInput",
"required": [
"id",
"text"
],
"properties": {
"id": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
以下是负载类型:
{
"type": "object",
"title": "AddNoteToLeadPayload",
"properties": {
"_id": {
"type": "objectId"
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"createdAt": {
"type": "string"
},
"createdBy": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
}
}
}
输入错误时 "type" 错误状态:
Expected valid values are:[array boolean integer number null object string]
输入错误时 "bsonType" 错误状态:
Expected valid values are:[string object array objectId boolean bool null regex date timestamp int long decimal double number binData]
我已经尝试了所有我能想到的组合,包括将所有 "bsonType" 更改为 "type"。我还尝试在使用 "type" 时将 _id 更改为字符串,或在 "bsonType" 时将 objectId 更改为字符串。无论我在使用突变时尝试什么组合,它都会按照预期的方式将注释添加到前导中,但 return 有效负载始终显示为空。我需要它 return _id 并注意它会在前端更新 Apollo 中的 InMemoryCache。
您好 Bernard – 目前自定义解析器表单 UI 中存在一个不幸的错误,它不允许您仅在 input/payload 类型中使用 bsonType – 我们正在努力解决这个。实际上,只要它们与您的数据一致,您就应该能够使用 type/bsonType 或两者的混合。我认为你想要的负载类型定义很可能是:
{
"type": "object",
"title": "AddNoteToLeadPayload",
"properties": {
"_id": {
"bsonType": "objectId"
},
"notes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"createdAt": {
"bsonType": "date"
},
"createdBy": {
"type": "string"
},
"text": {
"type": "string"
}
}
}
}
}
}
如果这不起作用,向我们提供您希望返回的数据示例可能会有所帮助。
我注意到您在致电 collection.findOneAndUpdate()
return
我尝试了这个函数(与你的类似)并将 GraphiQL 设置为 return 值(所有输入和有效负载类型都为 String
)
exports = function(input){
const mongodb = context.services.get("mongodb-atlas");
const collection = mongodb.db("todo").collection("dreams");
const query = { _id: input.id }
const update = {
"$push": {
"notes": {
"createdBy": context.user.id,
"createdAt": "6/10/10/10",
"text": input.text
}
}
};
const options = { returnNewDocument: true }
return collection.findOneAndUpdate(query, update, options).then(updatedDocument => {
if(updatedDocument) {
console.log(`Successfully updated document: ${updatedDocument}.`)
} else {
console.log("No document matches the provided query.")
}
return {
_id: updatedDocument._id,
notes: updatedDocument.notes
}
})
.catch(err => console.error(`Failed to find and update document: ${err}`))
}