【问题标题】:Passing req data into Q promise将 req 数据传递给 Q Promise
【发布时间】:2015-10-05 11:41:16
【问题描述】:

我认为 Javascript 闭包有问题?我有一个 Express + Mongoose 网络应用程序,并且正在使用 Q 库来实现 Promises。

我想知道是否可以将请求数据传递给承诺链,以便我可以成功执行以下代码。

目前,我无法设置review.reviewerreview.application。我目前能想到的唯一解决方案是将请求数据附加到req.body 对象,以便所有这些都在Review.create 上处理(请参阅替代解决方案代码)。不过,我不确定这是否是一个理想的解决方案,以及是否可以将 req 数据传递给 promise。

create: function(req, res) {
    console.log('Creating obj');

    Review.create(req.body).then(function(review) {
      Q.all([
        function() {
          review.reviewer = req.user.id;
          review.application = req.params.applicationId;
          return review.save();
        },
        User.findByIdAndUpdate(review.reviewer, {$push: {reviews: review._id}}).exec(),
        Application.findByIdAndUpdate(review.application, {$push: {reviews: review._id}}).exec(),
      ]).then(function() {
        req.flash('messages', {
          style: 'success', 
          type: 'Success',
          text: 'Your review has been submitted!',
        });
        res.redirect('/applications');
      }, function(err) {
        req.flash('messages', {
          style: 'danger', 
          type: 'Error',
          text: 'Something went wrong submitting the application!',
        });
        res.redirect('/applications');
      })
    });
  }

替代解决方案代码:

req.body.reviwer = req.user.id;
req.body.application = req.params.applicationId;
Review.create(req.body).then(...)

【问题讨论】:

  • Review.create({reviewer: req.user.id, application: req.params.applicationId}).then().. 有什么问题?
  • 完全有效!但是,我必须将 is 对象与我的 req.body 对象中的其他字段连接起来。我想知道是否有更好的方法。

标签: javascript node.js express promise q


【解决方案1】:

据我了解,您犯了两个错误:

  • Q.all 前面应该有一个 return
  • Q.all 的第一个元素是一个函数,我很确定它一定是一个承诺,

我已将功能细节放在外面,希望现在可以使用:

    ...
    Review.create(req.body).then(function(review) {
      review.reviewer = req.user.id;
      review.application = req.params.applicationId;
      return Q.all([
        review.save(),
        User.findByIdAndUpdate(review.reviewer, {$push: {reviews: review._id}}).exec(),
        Application.findByIdAndUpdate(review.application, {$push: {reviews: review._id}}).exec(),
      ]).then(function() {
    ...

【讨论】:

  • 承诺链在review.reviewer = req.user.id; 上失败。事实上,如果我尝试 console.log 该值,我什么也得不到(并且有一个登录用户,所以该对象不是未定义的)。
  • @tsurantino 确实,req.user.id 在你调用 Review.create 之前有一个值?
  • 显然没有!该代码有效。谢谢你的回答。
猜你喜欢
  • 2018-07-12
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
相关资源
最近更新 更多