使用Moongose和GraphQL保存实体后,数据为空 [英] Data null after saving entity with Moongose and GraphQL

查看:139
本文介绍了使用Moongose和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆