在NodeJS中异步执行我的函数

时间:2017-05-23 11:24:58

标签: javascript node.js mongodb asynchronous

我是NodeJS的新手。我知道有很多关于异步NodeJS的问题,但我无法找到我想要的东西。

我的问题是: 我想检查我的数据库中是否已存在用户名和电子邮件。用户名和电子邮件的两个单独功能。另一个功能是将数据存储到数据库。

我不知道如何使用异步NodeJS模式执行此操作。

User.js(mongoose Schema)

const mongoose = require('mongoose');
var userSchema = mongoose.Schema({
    name: String,
    username: { type: String, required: true, unique: true },
    password: { type: String, required: true },
    email: { type: String, required: true, unique: true},
    aiub_id: String,    
});
const Users = module.exports = mongoose.model('User', userSchema);

module.exports.addUser = function (user, callback) {
    user.save(callback);
}
module.exports.usernameExist = function (givenUsername, callback) {
    Users.find({ username: givenUsername }, callback);
}
module.exports.emailExist = function (givenEmail, callback) {
    Users.find({ username: givenEmail}, callback);
}

index.js(路线)

route.post('/signup', function(req, res){
// GRAB USER INFO FROM HTML FORM
var newUser = new User({
    name : req.body.tfullName,
    username : req.body.tusername,
    password : req.body.tpassword,      
    email : req.body.temail,
    aiub_id : req.body.tuserID
});

// This block send 200 if username doesn't exist
User.usernameExist(newUser.username, function (err, result){
    if(err){
        throw err;
    }
    if(result.length <= 0){
        res.send({status : 200 });
    }else{
        res.send({status : 100 });
    }
});

});

请帮我解决这个问题,请原谅,如果它听起来很愚蠢。

2 个答案:

答案 0 :(得分:3)

使用Promise s。

首先我建议你改变你的函数来返回promises而不是回调:

function userExists(parameters) {
  return new Promise((resolve, reject) =>
    Users.find(parameters, (err, result) => {
      if(err){
        reject(err);
      } else {
        resolve(result.length <= 0);
      }
    })
  );
}

module.exports.usernameExist = function (givenUsername) {
  return userExists({ username: givenUsername });
}

module.exports.emailExist = function (givenEmail) {
  return userExists({ email: givenEmail });
}

然后你将从parallell调用返回的promises包装到Promise.all中的这些函数中,这将返回一个新的promise,当所有包装的promises被解析时解析,然后你在那里做你的东西:

Promise.all([
  User.usernameExist(newUser.username),
  User.emailExist(newUser.email)
]).then((results) => {
  // results[0] contains the result from User.usernameExist
  // results[1] contains the result from User.emailExist
});

如果您不想在User模块中更改函数,则可以将调用包含在index.js文件的Promise中的那些函数中。

答案 1 :(得分:0)

只需在其他人的回调中调用一个函数,

// Check if username doesn't exist
User.usernameExist(newUser.username, function (err, result){
    if(err){
        throw err;
    }
    if(result.length <= 0){

        //check if email doesn't exist
        User.emailExist (newUser.email, function(err, result){
            if(result.length<=0){

                //save user
                User.addUser(newUser, (err, result)=>{
                     if(!err){
                         res.send({status : 200 });
                     }else{
                         res.send({status : 100 });
                     }
                })  
            }
        }
    }
});

人们更愿意承诺回调,使用承诺你必须从你的职能中回复承诺。使用promises代码更容易阅读,所以请查看。