使用Moongose和GraphQL保存实体后,数据为空 [英] Data null after saving entity with Moongose and GraphQL
问题描述
当使用mongoose和graphql保存实体时,会发生以下情况:
When saving an entity with mongoose and graphql the following happens:
第一种保存方法:
create(budgetProps){
const budget = new Budget(budgetProps);
return budget.save();
}
结果如下:
{
"data": {
"addBudget": {
"_id": "59fbdefaa7b0a81180dd2c9c",
"tiempoAproximado": 2245.5,
"User": {
"name": null,
"organization": null
},
"Vehicle": {
"name": null,
"type": null
}
}
}
}
使用此方法:
create(budgetProps){
const budget = new Budget(budgetProps);
return budget.save().then((res)=>{
Budget.findById(res._id)
.populate('User')
.populate('Vehicle')
.exec((err, newBudget)=> {
return newBudget;
});
});
},
我得到以下信息:
{
"data": {
"addBudget": null
}
}
这是架构:
const typeDefs = `
scalar Date
input UserInput {
_id: ID,
name: String,
organization: String,
phones: [String],
emails: [String],
type: String,
password: String,
percentaje: String
}
input VehicleDescriptionInput {
es: String,
en: String
}
input VehicleInput{
_id: ID,
name: String,
passengers: Int,
largeBags: Int,
smallBags: Int,
doors: Int,
type: String,
status: Boolean,
imagesUrls: [String],
description: VehicleDescriptionInput
}
input FinalTotalCostInput {
es: String,
en: String
}
input BudgetTotalCostInput {
es: String,
en: String
}
input BudgetInput {
finalTotalCost: FinalTotalCostInput,
budgetTotalCost: BudgetTotalCostInput,
destinoInicial: String,
destinoFinal: String,
tiempoAproximado: Float,
distancia: Float,
tollCost: Float,
tolls: [String],
budgetDate: Date,
aprove: Boolean,
User: UserInput,
Vehicle: VehicleInput
}
type Mutation {
addBudget(data: BudgetInput): Budget
}
`;
以下是解析器:
Mutation: {
addBudget: (_, {data}) =>{
return BudgetController.create(data);
}
},
最后是带有变量的突变:
Finally here is the mutation with its variables:
mutation addBudget($budget: BudgetInput) {
addBudget(data: $budget) {
_id
User{
name
organization
}
Vehicle{
name
type
}
}
}
{
"budget": {
"finalTotalCost": {
"es": "100 peso",
"en": "10 dolars"
},
"budgetTotalCost": {
"es": "80 peso",
"en": "8 dolars"
},
"destinoInicial": "Queretaro",
"destinoFinal": "Sonora",
"tiempoAproximado": 2245.5,
"distancia": 100.565,
"tollCost": 20.5,
"tolls": [
"GDL",
"Marina",
"Culap",
"Malageña"
],
"budgetDate": "2017/07/21",
"aprove": false,
"User": {
"_id": "59fbcc42aa82460924e5fbad"
},
"Vehicle": {
"_id": "59fbcbe4aa82460924e5fbac"
}
}
}
该实体正确存储在数据库中,当Console.log填充的搜索结果的结果正确时,我不知道发生了什么.
The entity is stored properly in the database, when Console.log the result of the populated search results are correct then I do not understand what is happening.
您可以在以下链接中找到整个应用程序: GitHub存储库
You can find the whole app in the following link: GitHub Repo
推荐答案
您正在混合Promises和回调. exec()
将返回一个Promise,但前提是没有任何参数传递给它.此外,您需要返回exec()
返回的Promise.
You're mixing Promises and callbacks. exec()
will return a Promise, but only if doesn't have any arguments passed to it. Additionally, you need to return the Promise that's returned by exec()
.
return budget.save().then((res) => {
return Budget.findById(res._id) // missing return here
.populate('User')
.populate('Vehicle')
.exec() // don't need anything else
})
您可以多清理一点:
return budget.save()
.then(res => Budget.findById(res._id)
.populate('User')
.populate('Vehicle')
.exec())
如果您需要转换findById
返回的结果,然后再将其移交给客户端:
If you need to transform the results returned by findById
before turning them over to the client:
return budget.save()
.then(res => Budget.findById(res._id)
.populate('User')
.populate('Vehicle')
.exec())
.then(res => {
res.foo = 'Foo'
return res
})
这篇关于使用Moongose和GraphQL保存实体后,数据为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!