我想在使用node.js完成所有promise之后在mongodb中插入数据

时间:2016-01-28 07:28:43

标签: node.js mongodb express mongoose promise

我通过使用promises推送数组中的错误但是在它推送数组中的错误之前它会检查插入数据的条件,就像我在插入数据一样。

var errorsArr= [];

var username = new Promise(function(resolve,reject){
    User.findOne({ "username": req.body.username },function(err,user){
        if(err)
            reject(err);

        if(user) {
            resolve(1);
        }else{
            resolve(0);
        }
    });
});
username.then(function(data){
    if( data == 1 )
        errorsArr.push({"msg": "Username already been taken."});
}).catch(function(err){
    console.log(err);
});

var email = new Promise(function(resolve,reject){
    User.findOne({ "email": req.body.email },function(err,user){
        if(err)
            reject(err);

        if(user) {
            resolve(1);
        }else{
            resolve(0);
        }
    });
});
email.then(function(data){
    if( data == 1 )
        errorsArr.push({"msg": "email already been taken."});
}).catch(function(err){
    console.log(err);
});

if(errorsArr.length >0)
{
    req.session.error = errorsArr;
    return  res.redirect('/auth/Registration');
}
else {
    var newUser = new User();
    newUser.username = req.body.username;
    newUser.password = req.body.password;
    newUser.sex = req.body.sex;
    newUser.email = req.body.email;
    newUser.phoneNumber = req.body.phoneNumber;
    newUser.age = req.body.age;
    newUser.designation = req.body.designation;
    newUser.timing = req.body.timing;
    var CurrentDate = moment.tz(new Date(req.body.joiningDate), "Asia/Karachi").unix();
    newUser.joiningDate = CurrentDate;
    newUser.save(function (err, user) {
        if (!err)
            return res.redirect('/auth/Login');
    });
}

你可以帮助我以更好的方式做到这一点我是node.js的新手。提前谢谢。

5 个答案:

答案 0 :(得分:1)

您正在混合异步和同步代码。

同步:

var errorsArr= [];

异步:

var username = new Promise(...{
  ...
});
username.then(..
  errorsArr.push(...);
})

同步:

if (errorsArr.length > 0) {
    ...

中间的异步部分(你errorsArr.push(…)所在的位置)实际上并没有在最后之前发生

如果您希望将其同步代码连续执行到其他异步代码,则需要将所有同步代码转换为异步代码。

其他答案已经解释了如何使用if (errorsArr.length > 0)

我还建议使用提供Bluebirdpromisification Promise库,这样您就可以宣传您的猫鼬模型,而不是为每个操作手动创建承诺。

Promise.all

您可能还想查看即将推出的ES2016添加到javascript,以进一步简化与async / await的承诺。有了它,你可以完全摆脱Promise.promisifyAll(User); var username = User.findOneAsync(...); // the new "findOneAsync" method returns a promise username.then(data => ...) ,只需写下:

.then(..)

Checkout this great article on async/await。虽然这需要您使用Babel或Typescript添加额外的转换步骤。还有最近发布的Microsoft's fork of Node随附chakra引擎(而不是V8),它已经支持async / await。

答案 1 :(得分:1)

这是一个例子

  Promise.all([
Reservation.find({'parking.owner': req.payload.id}).exec(),
Reservation.count({'parking.owner': req.payload.id}).exec(),
Reservation.aggregate([
   { $match: {
        _id: req.payload.id
    }},
    { $group: {
        _id: "$_id",
        total: { $sum: "$price"  }
    }}
    ])
  ]).then(results=>{
     const list = results[0]
     const count = results[1]
     const sum = results[2]
     res.status(200).json({list,count,sum});
  })

答案 2 :(得分:0)

完成所有 承诺

使用Promise.all

可以写下代码底部的错误检查:

Promise.all([username, email])
.then(function(results) {
    if(errorsArr.length >0)
    {
        ...
    }
    else {
        ...
    }
});

对代码进行最快速,最简单的更改 - 重构代码可以使代码更加流畅

答案 3 :(得分:0)

Promise.all是您的解决方案。它等待所有的承诺。

 Promise.all([p1,p2,..]).then(function() {
      // all loaded
  }, function() {
   // one or more failed
 });

参考链接:

http://www.html5rocks.com/en/tutorials/es6/promises/

答案 4 :(得分:0)

@Jaromanda X如果有用户名和电子邮件检查是独立的并且不必遵循任何订单,则答案是正确的。否则,你必须做一个承诺链。