【问题标题】:Promisify without object instancePromisify 没有对象实例
【发布时间】:2020-06-02 09:57:17
【问题描述】:

如果我们已经创建了池,我们可以promisify mysql pool getConnection函数,像这样:

const mysql = require('mysql');
const util = require('util');

const mysqlPool = mysql.createPool(CONFIG);

const getConnectionPm = util.promisify(mysqlPool.getConnection).bind(mysqlPool);

用法可以是这样的:

(async() => {
    const connection = await mysqlPool.getConnectionPm();

});

如何保证mysqlPool.getConnection.query 函数使用connection 变量?制作这样的东西:

(async() => {
    const connection = await mysqlPool.getConnectionPm();

    const result = await connection.queryPm(SQL_QUERY, SQL_ARGS);
});

问题是我不知道如何将connection 变量传递给promisify 函数。我想另一种方法是使用getConnectionPm 函数创建一个连接对象,然后将查询绑定到该对象,就像我们为getConnection 本身所做的那样。但是我们如何才能实现类似上面的代码呢?

例如,下面的代码给出了一个未定义的错误:

const getConnectionPm = util.promisify(mysql.createPool.getConnection);

【问题讨论】:

  • util.promisify(connection.query.bind(connection)) 呢?
  • @Lux 我可以做类似mysqlPool.getConnectionPm = util.promisify(mysqlPool.getConnection.bind(mysqlPool)); 的事情。但是在从getConnection 函数获取连接之前,我没有连接变量来承诺它。像这样的东西不起作用util.promisify(mysqlPool.getConnection.query.bind(mysqlPool.getConnection)),因为查询未定义。
  • 在你创建连接之后再承诺。

标签: javascript node-promisify


【解决方案1】:

您可以更改您的 getConnectionPm,并为每个连接添加一个queryPM promisified 查询方法。

const getConnectionPm = async () => {
    const conn = await util.promisify(mysqlPool.getConnection).call(mysqlPool);
    conn.queryPm = util.promisify(conn.query).bind(conn);
    return conn;
}

然后你可以像你的例子一样查询。

(async() => {
    const connection = await mysqlPool.getConnectionPm();
    const result = await connection.queryPm(SQL_QUERY, SQL_ARGS);
});

【讨论】:

  • 感谢您的回答。我认为我们应该在定义conn 之后创建另一个变量来调用它并创建一个连接实例,因为在第三行中没有定义conn.query。此更改后它起作用了。
  • 这很奇怪。 await 应该已经创建了 Connection 的实例。你确定你在util.promisify(mysqlPool...)前面加了await吗?
  • 是的,我又试了一次,确切的错误是The "original" argument must be of type Function. Received type undefined,当我尝试访问conn.query 时会发生这种情况。我不认为这是对awaits 工作的有效假设。实际上,我们不需要await,而是从这个conn 函数创建连接。我已经编辑了代码。
  • 好的,我发现了我的错误。我实际上并没有打电话给getConnection。我需要在第一行末尾添加(),例如util.promisify(mysqlPool.getConnection).bind(mysqlPool)()
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多