我是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 });
}
});
});
请帮我解决这个问题,请原谅,如果它听起来很愚蠢。
答案 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代码更容易阅读,所以请查看。