【问题标题】:Node.js constant is not waiting for response from async functionNode.js 常量不等待异步函数的响应
【发布时间】:2021-08-09 06:25:10
【问题描述】:

我是 async/await 的新手,我正在尝试将“用户”常量设置为 Node.js 中 MySQL 查询的返回值。但是,常量不等待函数的返回值。如何使用 async 和 await 将 'user' 设置为 SQL 查询的返回值?

// Should return a user object
const getUserByUsername = async (username, db) => {

  const QUERY = `SELECT * FROM ${table_name} WHERE username = '${username}'`;
    
    const user = await db.query(QUERY,
      async (err, result) => {

        if (!err) {

          console.log("name in SQL function: " + result[0].username);
          return await result[0];

        } else {
          console.log(err);
        }
      }
    );
    return user;
};

// Does stuff with the user object
const authenticateUser = async (username, password, done) => {

    const user = await getUserByUsername(username, db);
    console.log("name in main function: " + user.username);

    // Trying to do stuff with the user object...
  }

我在终端得到什么:

name in main function: undefined

UnhandledPromiseRejectionWarning: Error: data and hash arguments required
at Object.compare
at /app/node_modules/bcrypt/promises.js:29:12
at new Promise (<anonymous>)
at Object.module.exports.promise
etc.....


name in SQL function: john

【问题讨论】:

  • 既然name in SQL function: john 不是name 设置?问题似乎源于 Object.compare 中缺少的论点“数据”和“哈希”
  • 这似乎是一个非常注释的误解。 await 只有在等待连接到异步操作的承诺时才会做任何有用的事情。因此,await db.query(..., function()[ ... }) 中的 await 什么都不做,因为当您传递回调时,db.query() 不会返回承诺。带有承诺或普通回调的代码,而不是混合代码。而且,return await result[0]; 还说明您需要了解 await 的实际作用,因为它根本没有做任何事情。

标签: javascript mysql node.js async-await


【解决方案1】:

当您将db.query 与回调一起使用时,它不会返回承诺

试试下面的代码

const getUserByUsername = async (username, db) => {
    const QUERY = `SELECT * FROM ${table_name} WHERE username = '${username}'`;
   
    const result = await db.query(QUERY);
    console.log("name in SQL function: " + result[0].username);
    return result[0];
};

【讨论】:

  • 现在试过了,console.logs 现在的顺序是正确的,但我现在得到“SQL 函数中的名称:未定义”,getUserByUsername() 返回未定义。
  • @HermanBjørnerud - 奇怪 - console.log(result) 看起来像什么?和console.log(result[0]) - 如果有的话,那部分代码在功能上与你的代码相同,只是为await 正确完成了 - 也许你做错了什么?
【解决方案2】:

请尝试以下代码。

const getUserByUsername = async (username, db) => {
try {
    const QUERY = `SELECT * FROM ${table_name} WHERE username = '${username}'`;

    const user = await db.query(QUERY, async (err, result) => {
        if (err) {
            throw err;
        }
        if (result && result.length) {
            return result[0];
        }
        throw new Error(`User with username ${username} not found`);
    });

    console.log(`name in SQL function: ${user.username}`);
    return user;

} catch (error) {
    console.log(error);
    throw error; 
}

};

【讨论】:

    【解决方案3】:

    在 jfriend00 的评论之后,我决定将我的函数设为回调函数。我找到了解释如何做到这一点的答案:https://stackoverflow.com/a/31875808/6817961。这行得通!

    我现在的代码:

        // Function returns a user object
          const getUserByUsername = (username, callback) => {
    
            const QUERY = `SELECT * FROM ${db_name} WHERE username = '${username}'`;
    
            db.query(QUERY, (err, result) => {
    
              if (!err) {
    
                if (result.length > 0) {
                  return callback(null, result[0]);
    
                } else {
                  err = "No user with that username";
                  return callback(err, null);
                }
    
              } else {
                return callback(err, null);
              }
            });
          };
    
     // Then this function does stuff with the callback
      const authenticateUser = (username, password, done) => {
    
        getUserByUsername(username, async (err, result) => {
    
          if (err) {
            console.log(err);
            return done(null, false, { message: err });
    
          } else {
            const user = result;
            // result will now return the user object!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2016-02-14
      • 2023-03-13
      • 2011-09-03
      相关资源
      最近更新 更多