【问题标题】:Express.js using await with passportExpress.js 使用 await 和护照
【发布时间】:2020-06-25 22:56:43
【问题描述】:

我正在尝试将 mySQL 添加到 passport.js 以验证 express.js 中的用户,但似乎无法等待工作。 Server.js:

initializePassport(
  passport,
  function(email) {
    pool.getConnection(function(err, connection) {
      if (err) throw err;
      console.log("Connected!");
      pool.query("SELECT * FROM users WHERE email = ?", email, function (err, result) {
        if (err) throw err;
        return result[0];

        connection.release();
      });
    });
  },
)

护照配置

function initialize(passport, getUserByEmail) {
  const authenticateUser = async (email, password, done) => {
    try {
      const user = await getUserByEmail(email);
      console.log(user)
    } catch (e) {
      return done(e)
    }

现在它只是为用户打印 undefined,然后打印 Connected。我不确定为什么 await 用户不工作。

【问题讨论】:

  • 这里有很多问题:所有if (err) throw err; 都需要替换为真正的错误处理。将connection.release() 放在return 语句之后是没有用的,并且不会释放连接。至于您的主要问题,请向我们展示getUserByEmail() 代码,以便我们了解为什么它不能与await 一起正常工作。
  • 对不起,如果不清楚,功能(电子邮件)是getUserByEmail

标签: mysql node.js express passport.js


【解决方案1】:

好吧,如果那是getUserByEmail(),那么它不会返回一个连接到它的异步操作完成的承诺,因此,执行await getUserByEmail() 不会等待任何事情。

await 仅当您正在等待与您想要等待的操作相关的承诺时才会做一些有用的事情。由于您甚至没有等待承诺,因此 await 没有任何用处。您需要更改 getUserByEmail() 以便它返回一个连接到您尝试等待的异步操作的承诺。

要让函数返回连接到异步操作的 Promise,您需要在该函数的任何地方使用基于 Promise 的异步操作,而不是普通的回调异步操作。这些都是数据库操作,所有现代数据库现在都有一个基于 Promise 的界面,所以你真正想要做的就是切换 .getConnection().query().release() 以全部使用基于 Promise 的操作。这也将使实施正确的错误处理和与错误调用者的正确通信变得更加简单。

我自己对mysql不是特别了解,但这里有一个大概的想法。 promise接口来自模块mysql2/promise

const mysql = require('mysql2/promise');
const pool = mysql.createPool({...});

initializePassport(passport, async function(email) {
    let connection;
    try {
        connection = await pool.getConnection();
        console.log("Connected!");
        let result = await pool.query("SELECT * FROM users WHERE email = ?", email);
        return result[0];
    } catch(e) {
        // log the error and the rethrow so the caller gets it
        console.log(e);
        throw e;
    } finally {
        if (connection) {
            connection.release();
        }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 2019-05-23
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多