【问题标题】:How to work with async and await with select from database in node js [duplicate]如何在节点js中使用异步和等待从数据库中选择[重复]
【发布时间】:2026-02-02 12:00:01
【问题描述】:

到目前为止,我已经完成了一个项目,其中我使用了一个回调,但是对于更大的代码库,我已经陷入了混乱。我想继续做一些新的事情,特别是异步函数。

我正在使用 oop 模式,所以我希望将其直接实施到 oop 中。 问题是,我以前从未这样做过,也不知道该怎么做。我有一些带有回调的基本代码。请问谁能把它改成异步函数?

server.js

const object = require("./object");

new object(userID).name((data) => {
  console.log(data);
});

object.js

module.exports = class{

  constructor(userID){
    this.id = userID;
  }

  name(callback){
    mysqli.query("SELECT meno FROM uzivatelia WHERE id='"+ this.id +"'", (err, user) => {
      callback(user[0].meno);
    });
  }

}

【问题讨论】:

  • 不要忘记转义this.id参数以防止SQL注入。

标签: javascript node.js express oop asynchronous


【解决方案1】:

@Tom 的建议是正确的。另一种选择是使用节点的util.promisify,它实现了同样的效果,但更简洁。

const util = require('util');
const mysqliQueryP = util.promisify(mysqli.query);

module.exports = class{

  constructor(userID){
    this.id = userID;
  }

  name() {
    return mysqliQueryP("SELECT meno FROM uzivatelia WHERE id='"+ this.id +"'");
  }

}

【讨论】:

    【解决方案2】:

    返回一个显式的 Promise,你连接到 mysqli 回调模式:

    module.exports = class {
    
        constructor(userID) {
            this.id = userID;
        }
    
        name() {
            return new Promise((resolve, reject) => {
                mysqli.query(
                    `SELECT meno FROM uzivatelia WHERE id = '${this.id}'`,
                    (error, record) => error ? reject(error) : resolve(record)
                )
            })
        }
    
    }
    

    您也可以在方法定义之前添加async,但我认为这不会产生任何影响——无论您是否使用async 声明它并调用代码,当您返回Promise 时,该方法都会变为异步的可以await它。

    const User = require('./user.js')
    
    async testIt() {
        const myUser = new User(12345)
        const username = await myUser.name()
        console.log(username)
    }
    
    testIt()
    

    一些一般性提示。首先,为了清楚地显示堆栈跟踪,您需要为这个类命名。

    其次,可能值得您花点时间研究一个解决方案,以对您的 mysqli 调用进行去节点化。如果这样的东西还不存在,我会感到非常惊讶。如果没有,你可以很容易地构建一些小东西来满足你最需要的情况。

    【讨论】: