2017-12-13 18 views
4

私はここで私ができないチェーンを適切約束は、私のコードはできませんチェーンの約束

app.post('/login', urlencodedParser, async (req, res) => { 
    // authenticate is async function that return promise 
    model.authenticate(req.body.uname, req.body.pword) 
    .then(function (result) { 
     console.log(result); 
     // ... some codes 
    }); 
}); 

// here is the function authenticate 
async function authenticate(uname, pword) { 
    User.find({username: uname}, 'password', function (err, result) { 
    if (err !== null){ 
     return new Promise(function (resolve, reject) { 
     resolve(false); 
     }); 
    } 
    else{ 
     if (pword === result[0].password){ 
     console.log("Correct Password!"); 
     return new Promise(function (resolve, reject) { 
      resolve(true); 
     }); 
     } 

あるしかし、私のコンソールの出力は

undefined 
Correct Password! 

で、なぜ何のアイデアを得るん認証が終了する前に.then()が実装されていることを示します。 これをより良い方法でどのようにコード化できますか?どうもありがとうございました!

+1

@ 31piy非同期機能は必ずしも待つ必要はありません。 –

+0

'function authenticate'は何も返しません。したがって、' async function authenticate'のようにPromiseを 'undefined'に解決しました。これはあなたが見ているものです –

+0

Thz all、私はそれを得ました – JACKY

答えて

1

問題は、あなたの認証関数の本文が何も返されないということです。コールバックを使用する非同期関数を呼び出し、次に解決する暗黙の約束をundefinedに返します。

async function authenticate(uname, pword) { 
    User.find({username: uname}, 'password', function (err, result) { 
    // This will run sometime after authenticate returns 
    }); 
} 

あなたは約束でUser.find呼び出しをラップする必要があります。 async

// here is the function authenticate 
async function authenticate(uname, pword) { 
    return new Promise(function (resolve, reject)() { 
    User.find({username: uname}, 'password', function (err, result) { 
     if (err !== null){ 
     resolve(false); 
     } 
     else{ 
     if (pword === result[0].password){ 
      console.log("Correct Password!"); 
      resolve(true); 
     } 
     // Also add an else here, to ensure the promise always ends: 
     else { 
      resolve(false); 
     } 
     } 
    }); 
    }); 
} 
1

async function authenticate(uname, pword) { 
    return await User.find({ username: uname }, 'password').then(function (result) { ... }) 
}; 

asyncなし:

function authenticate(uname, pword) { 
    return User.find({ username: uname }, 'password').then(function (result) { ... }) 
}; 
+0

' User.find'また約束を返す、これは動作しません。 –

+0

はい。 Node.jsのほとんどのORMは約束に基づいています。彼はそれを試してみるべきです。 –

1

問題は、コールバック関数からの約束を戻ってきているということです。それには何の意味もありません。 authenticateファンクション&からの約束を返す必要があります。次のコードを見て、それはあなたの問題を修正する必要があります

/* This function doesnt need to be async */ 
function authenticate(uname, pword) { 
    return new Promise((resolve, reject) => { 
    User.find({username: uname}, 'password', function (err, result) { 
     if (err !== null) { 
     /* I think this should be reject(err) but since you wish to have it resolved in your code, i have kept resolve()*/ 
     resolve(false); 
     } 
     else { 
     if (pword === result[0].password) { 
      console.log("Correct Password!"); 
      resolve(true); 
     } 
     } 
    }) 
    }); 
} 
関連する問題