我正在尝试从一个表单中发布到/ user / create路由数据,这些数据一切正常,然后逐个检查数据是否有效,在某些情况下是数据库中唯一的。这是我用来检查注册表单上输入的用户和电子邮件地址。
该函数似乎正常查询,但最后,我收集的错误消息的console.log只收集第一个条目。
// Check if variable is already is available or not
var existsInDatabase = function(field, value){
var deferred = Q.defer();
var query = {};
var errorMessage = {};
query[field] = value;
User.find(query, function(err, docs){
// If it finds it, then set a message for already existing
if(docs){
errorMessage = {'type': 'alert', 'body': value + ' already exists in the database.'}
deferred.resolve(errorMessage);
} else {
deferred.reject( value + ' was not found in the database');
}
});
return deferred.promise;
};
我在这里检查密码是否匹配。
var doPasswordsMatch = function(password, confirmed){
var deferred = Q.defer();
console.log('Values passed into doPasswordsMatch() function:', password + ' ' + confirmed);
if(password !== confirmed){
errorMessage = {'type': 'alert', 'body': 'The two passwords you entered do not match'};
deferred.resolve(errorMessage);
};
return deferred.promise;
}
这是我使用.then链接的路线。
router.post('/user/create', function(req, res){
var errorMessages = [];
existsInDatabase('userName', req.body.username)
.then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
.then(existsInDatabase('userEmail', req.body.email))
.then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
.then(doPasswordsMatch(req.body.password, req.body.confirmedPassword))
.then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } })
.then(function(){ console.log(errorMessages); });
});
我想我正在努力的是.then的链接以及如何阻止某些东西触发,除非它之前的所有内容都已完成。
答案 0 :(得分:1)
then()
将函数作为参数(full specification),但您传递的是第2个和第4个.then()
的承诺。如果你将它们包装在匿名函数中,它应该可以工作。
...
.then(function() { return existsInDatabase('userEmail', req.body.email); })
...
.then(function() { return doPasswordsMatch(req.body.password, req.body.confirmedPassword); })
...
return
因此existsInDatabase()
和doPasswordsMatch()
返回的承诺已经解决,然后转到下一个then()
但是,您可能需要重新考虑逻辑的设置方式。目前的方式是,如果密码匹配,则永远不会调用下一个.then
,逻辑就会卡住。