如何在 mongoose .save().then() 之外返回一个对象?

Posted

技术标签:

【中文标题】如何在 mongoose .save().then() 之外返回一个对象?【英文标题】:How to return an object outside of mongoose .save().then()? 【发布时间】:2019-02-20 18:48:35 【问题描述】:

我有一个 GraphQL 突变,它尝试使用 Mongoose 将对象保存到 MongoDB 集合:

Mutation: 
    addPost: (parent, args) => 
      let output = ;
      const newpost = new dbPost(
        _id: new mongoose.Types.ObjectId(),
        title: args.title,
        content: args.content,
        author: 
          id: args.authorid,
          first_name: args.authorfirstname,
          last_name: args.authorlastname,
        
      );
      newpost.save().then((result) => 
        output = result;
      );
      return output // returns null, need result!
    ,
  

脚本工作得很好,因为它成功地将对象(通过 args 传递给它)保存到集合中。但是,我无法返回从 .then() 内部返回的对象以进行进一步处理。在 GraphiQL 中,响应是一个空对象。有什么办法,我可以在 .then() 之外返回 result 的值?

【问题讨论】:

【参考方案1】:

你可以尝试像这样使用异步等待:

  Mutation: 
      addPost: async (parent, args) => 
        let output = ;
        const newpost = new dbPost(
          _id: new mongoose.Types.ObjectId(),
          title: args.title,
          content: args.content,
          author: 
            id: args.authorid,
            first_name: args.authorfirstname,
            last_name: args.authorlastname,
          
        );
        output = await newpost.save();
        return output 
      ,
    

然后从你调用 addPost 的地方调用它:await Mutation.addPost

【讨论】:

【参考方案2】:

@Mehranaz.sa answer 是正确的!

但是 GraphQL 解析了 Promise,所以你可以简单地写这个:

Mutation: 
    addPost: (parent, args) => 
      let output = ;
      const newpost = new dbPost(
        title: args.title,
        content: args.content,
        author: 
          id: args.authorid,
          first_name: args.authorfirstname,
          last_name: args.authorlastname,
        
      );
      return newpost.save();
    ,
  

它也很好用! PS:使用ObjectId时不需要提供_id:)

【讨论】:

以上是关于如何在 mongoose .save().then() 之外返回一个对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 中等待 model.save()

NestJS + Mongoose:如何测试 document(data).save()?

mongoose 文档 Promises

Mongoose 异步 .save 和回调

猫鼬承诺文档说查询不是承诺?

在任何传入的回调完成后是不是会发生 Mongoose 查询 `then` 调用?