私は/ user /にルートデータを作成しようとしていますが、すべてのデータが有効で、場合によってはデータベース内で一意であることを順番にチェックします。ここでは、登録フォームに入力されたユーザーと電子メールアドレスを確認するために使用しているものです。これまでの文が完了するのを待つことはありません。
機能は正しく照会されているようですが、最終的に私が収集しているエラーメッセージの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の連鎖であり、それが完了する前に、すべてのものがない限り、トリガから何かを防ぐ方法。
なぜ時々関数を渡し、ときには 'then'を約束しますか? '.then(console.log(errorMessages))'が動作すると思いますか? – Bergi