Javascript Can';不要违背诺言

Javascript Can';不要违背诺言,javascript,asynchronous,Javascript,Asynchronous,我不知道为什么我不能正确地连接承诺,这是我的代码 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

我不知道为什么我不能正确地连接承诺,这是我的代码

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()是在完成身份验证之前实现的。
那么,我如何才能以更好的方式编写代码呢?多谢各位

问题在于,authenticate函数的主体不返回任何内容。它调用一个异步函数,该函数使用回调,然后返回一个隐式承诺,该承诺解析为
未定义的

async function authenticate(uname, pword) {
  User.find({username: uname}, 'password', function (err, result) {
    // This will run sometime after authenticate returns
  });
}
您需要包装
用户。在承诺中查找
调用

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

使用
异步

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

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

问题是您正在从回调函数返回承诺。那样做没有意义。您需要从
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);
        }
      }
    })
  });
}

@31P异步函数不一定需要等待。
函数身份验证
不返回任何内容,因此,正如
异步函数身份验证
一样,它将返回一个解析为
未定义
的承诺-这就是您所看到的。我得到了一个无需等待的
用户。find
也会返回一个承诺,这行不通,是的。Node.js中的大多数ORM都是基于承诺的。他应该试试看。