2017-12-13 4 views
4

ich keine Ahnung bekommen, warum ich das Versprechen nicht richtig Kette kann, hier ist mein CodeKann nicht-Kette das Versprechen

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

Aber der Ausgang in meiner Konsole ist

undefined 
Correct Password! 

, die geben Sie an, dass .then() implementiert wird, bevor die Authentifizierung abgeschlossen ist. Also wie kann ich es besser kodieren? vielen Dank!

+1

@ 31piy Eine asynchrone Funktion muss nicht unbedingt abgewartet werden. –

+0

'Funktion authenticate' gibt nichts zurück, folglich, weil es' async Funktion authenticate' ist, wird es ein Versprechen zurückgeben, das auf 'undefined' aufgelöst wird - was Sie sehen –

+0

Thz alles, ich habe es – JACKY

Antwort

1

Das Problem ist der Körper Ihrer Authentifizierungsfunktion gibt nichts zurück. Es ruft eine asynchrone Funktion auf, die einen Callback verwendet, und gibt dann eine implizite Zusage zurück, die in undefined aufgelöst wird.

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

Sie müssen den User.find Anruf in einem Versprechen wickeln.

// 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

Mit async:

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

Ohne async:

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

Es sei denn' User.find' gibt auch ein Versprechen, das wird nicht funktionieren. –

+0

Ja. Die meisten ORM in Node.js basieren auf Versprechen. Er sollte es versuchen. –

1

Problem ist, dass Sie Versprechen von einer Callback-Funktion zurückkehren. Das hat keinen Sinn. Sie müssen ein Versprechen von der authenticate Funktion & zurückgeben/ablehnen, sobald die Funktion die beabsichtigte Arbeit erledigt. Sehen Sie sich den folgenden Code an, der Ihr Problem beheben sollte:

/* 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); 
     } 
     } 
    }) 
    }); 
} 
Verwandte Themen