2016-07-28 5 views
0

私は/ 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の連鎖であり、それが完了する前に、すべてのものがない限り、トリガから何かを防ぐ方法。

+0

なぜ時々関数を渡し、ときには 'then'を約束しますか? '.then(console.log(errorMessages))'が動作すると思いますか? – Bergi

答えて

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); }) 
... 

returnexistsInDatabase()doPasswordsMatch()によって返された約束はしかし、次then()

に移動する前に、あなたはあなたのロジックが設定されている方法を再考する必要があるかもしれません解決されそうです。現在の方法では、パスワードが一致した場合、次の.thenは呼び出されず、ロジックが停止します。

関連する問題