所以我实际上正在使用node.Js编写一个简单的程序,并且我使用async.waterfall时遇到了问题:
我在我的用户模型中创建了一个函数,通过访问数据库来连接用户,这里是代码:
exports.connection = function (login,password) {
async.waterfall([
function getLogin(callback){
usersModel.findOne({ login: login }, function (err, res) {
if (err){
callback(err,null);
return;
}
if(res != null ){
// test a matching password if the user is found we compare both passwords
var userReceived = res.items[0].login;
callback(null,userReceived);
}
});
},
function getPassword(userReceived, callback){
console.log(userReceived);
callback(null,'done')
}
], function(err){
if (err) {
console.error(err);
}
console.log('success');
});
}
使用node-inspector我发现主要问题(我认为)是当它进入瀑布函数时它不执行findOne的回调函数它会直接跳过它并直接跳转到getPassword函数(这是也执行了。
所以,如果有人可以帮我弄清楚问题是什么,因为我现在已经用了大约两天了。
谢谢
修改 添加了不同的测试缺失案例(这就是回调没有奏效的原因)后,我有了这个连接函数:
exports.connection = function (login,password) {
async.waterfall([
function getLogin(callback){
usersModel.findOne({ login: login }, function (err, res) {
console.log('login: ',res.login);
console.log('erreur: ',err);
if (err){
callback(err,null);
return;
}
if(!res)
{
console.log('getLogin - returned empty res');
callback('empty res');
}
if(res != null ){
// test a matching password if the user is found we compare both passwords
var userReceived = res;
callback(null,userReceived);
}
});
},
function getPassword(userReceived, callback){
console.log('login received :',userReceived.login);
var Ulogin = userReceived.login;
var Upassword = userReceived.password;
// function that compare the received password with the encrypted
//one
bcrypt.compare(password, Upassword, function(err, isMatch) {
if (err) {
console.log(err);
callback(err,null);
return;
}
else if (isMatch) {
console.log('Match', isMatch);
callback(null,isMatch);
}
else {
console.log('the password dont match', isMatch);
callback('pwd error',null);
}
});
},
], function(err){
if (err) {
console.error('unexpected error while connecting', err);
return false;
}
console.log('connected successfully');
return true;
});
}
在我的主文件server.js中,我正在做的事情:
var connect = users.connection(login,password);
//the goal is to use the connect variable to know if the connection
//failed or not but it's 'undefined'
if(connect){
res.send('youyou connecté');
}
else {
res.send('youyou problem');
}
这绝对不行,所以我试图使用Q库,但我有一个错误说
“TypeError:无法读取Promise.apply中未定义的属性'apply'”
这是使用Q的代码:
app.post('/signup', function (req, res) {
var login = req.body.login;
var password = req.body.password;
Q.fcall(users.connection(login,password))
.then(function (connect) {
if(connect){
res.send('connected');
}
else {
res.send('problem');
}
})
.catch(function (error) {
throw error;
})
.done();
});
但我有点惊讶我认为通过使用async.waterfall()我告诉函数等待它收到所有回调返回所以我不明白为什么connect变量是'undefined'?
答案 0 :(得分:0)
我不明白的是 - 究竟是什么流程?做过用户模特。找到了一个'被叫?
我在getLogin函数中看到的内容是回调,如果' if'声明返回false。在这种情况下,您将陷入第一个功能,并且您无法前进到“获取密码”。功能
如果仍然无效,请尝试执行以下代码并报告打印内容:
exports.connection = function (login,password) {
async.waterfall([
function getLogin(callback){
usersModel.findOne({ login: login }, function (err, res) {
if (err){
console.log('getLogin - error has occured');
callback(err,null);
return;
}
if(!res)
{
console.log('getLogin - returned empty res');
callback('empty res');
}
console.log('getLogin - result seems OK');
// test a matching password if the user is found we compare both passwords
var userReceived = res.items[0].login;
callback(null,userReceived);
}
});
},
function getPassword(userReceived, callback){
console.log('getPassword');
console.log(userReceived);
callback(null,'done')
}
], function(err){
if (err) {
console.error(err);
}
console.log('success');
});
}