Mongoose 异步 .save 和回调

Posted

技术标签:

【中文标题】Mongoose 异步 .save 和回调【英文标题】:Mongoose asynchronous .save and callback 【发布时间】:2018-04-08 14:59:36 【问题描述】:

这是您可以解释但不知道如何解决的问题之一。我有一个简单的store 方法:

exports.store = async (req, res) => 
    const mydata = new MyModel(req.body)
    await mydata.save(function(err,user) 
        res.location('/mydata/id/' + user._id)
    )
    res.status(201).json( data: userdata )

当它运行时,我收到以下错误:

events.js:182
      throw er; // Unhandled 'error' event
      ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:489:11)
    at ServerResponse.setHeader (_http_outgoing.js:496:3)
    at ServerResponse.header (.../node_modules/express/lib/response.js:730:10)
    at ServerResponse.location (.../node_modules/express/lib/response.js:847:15)
    at .../src/controllers/users-controller.js:26:13
    at .../node_modules/mongoose/lib/model.js:3919:16
    at .../node_modules/mongoose/lib/services/model/applyHooks.js:162:20
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)

Process finished with exit code 1

我的回调函数似乎是单独异步运行的,因为res.status(201).json( data: userdata ) 似乎正在产生错误并且不允许我设置位置标头。

我已经四处寻找如何设置位置标题,但没有一个答案像我想要做的那样。这似乎是以前应该做的事情......?我正在寻求有关如何执行此操作的帮助...

【问题讨论】:

【参考方案1】:

你混淆了两种思维方式:

承诺(在您的情况下使用 async/await) 回调

只用一个


try 
   const user = await mydata.save();

   res.location(`/mydata/id/$user._id`);

   // Other stuff ...
 catch(err) 
   // Handle the errors


here 你会收到一篇关于 Promises into mongoose 的文章。

【讨论】:

确实!我懂了!我不知道您可以将const user 放在右侧。我虽然为了访问user,你需要使用回调。效果很好!谢谢!

以上是关于Mongoose 异步 .save 和回调的主要内容,如果未能解决你的问题,请参考以下文章

将回调代码改进为异步等待猫鼬

then 语句中的异步 Mongoose 回调

你怎么知道 Model.prototype.save() 函数对 mongoose 的参数?

Mongoose pre.save() 异步中间件未按预期工作

Mongoose pre.save() 异步中间件未按预期工作

在使用 mongoose 完成两个异步查询后进行回调