我是新的两个nodejs和sails。我想在一个动作中创建两个模型。我的问题是如何处理两个查询中可能发生的错误。
当前代码:
new: function (req, res) {
var errorArray = [];
var data = req.allParams();
User.create({
username: data.username,
password: data.password,
device_id: data.device_id,
own_number: data.own_number,
mobile_numbers: data.mobile_numbers
}).exec(function (err, user) {
if(err){
errorArray.push(err);
}
});
Mobile_number.create({
number: data.own_number,
number_id: this.hash(data.own_number)
}).exec(function(err, mobile_number){
sails.log(err);
if(err){
errorArray.push(err);
}
});
if(errorArray.length == 0){
return res.ok('success');
}else {
return res.send(errorArray.toString());
}
}
此代码的问题是在查询完成之前处理最后的if。什么是等待查询的正确方法?
布鲁诺
答案 0 :(得分:1)
首先,您的代码将无法运行,因为node.js是异步的。因此,在执行函数之前检查是否存在错误。以下是两个解决方案:
您可以使用async.series。如果你使用它,如果第一个方法失败它将停止执行,它将返回它的错误。它成功了它将采用第二种方法。
async.series([
function(callback) {
User.create({
username: data.username,
password: data.password,
device_id: data.device_id,
own_number: data.own_number,
mobile_numbers: data.mobile_numbers
}).exec(callback);
},
function(callback) {
Mobile_number.create({
number: data.own_number,
number_id: this.hash(data.own_number)
}).exec(callback);
}
],
function(error, results) {
// error first finished
if(error)
res.send('error');
else
res.send('success');
}
);
或者你可以通过回调传统方式。
new: function(req, res) {
var errorArray = [];
var data = req.allParams();
var mobileCreateCallback = function(err, mobile_number, user) {
sails.log(err);
if (err) {
errorArray.push(err);
}
if (errorArray.length === 0) {
sails.log(user, mobile_number);
return res.ok('success');
} else {
return res.send(errorArray.toString());
}
};
var userCreateCallback = function(err, user) {
if (err) {
errorArray.push(err);
}
Mobile_number.create({
number: data.own_number,
number_id: this.hash(data.own_number)
}).exec(function(error, mobile_number) {
mobileCreateCallback(error, mobile_number, user);
});
};
User.create({
username: data.username,
password: data.password,
device_id: data.device_id,
own_number: data.own_number,
mobile_numbers: data.mobile_numbers
}).exec(userCreateCallback);
}
你应该关注回调:callbackhell和node.js / sails.js中的异步函数。