【问题标题】:UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 22): ReferenceError: client is not definedUnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:22):ReferenceError:未定义客户端
【发布时间】:2017-10-25 12:56:47
【问题描述】:

我提出的每个http 请求似乎都会出现此错误。我不完全确定它来自哪里?

(node:39390) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 22): ReferenceError: client is not defined

错误中没有行号,但这里有一个似乎导致它的代码示例:

try {
    var client = await pool.connect();
    await client.query(queryStatement, queryArgumentsArray);
    res.sendStatus(200);
} catch (e) {
    console.log('Error adding updating subvendor availability data, UPDATE SQL query task', err);
    res.sendStatus(500);
} finally {
    client && client.release && client.release();
}

首先我认为它一定来自我的 finally 块(可能 client 超出范围),但我添加了 if 语句以明确防止尝试调用 client.release(如果它不存在):

if (client) { client && client.release && client.release() };

我仍然收到此错误,所以我觉得它一定来自这些行。

var client = await pool.connect();
await client.query(queryStatement, queryArgumentsArray);
res.sendStatus(200);

我是否误解了如何使用异步?需要明确的是,代码运行良好,http 请求正在运行(正确响应请求),我的终端刚刚被这些警告淹没。

这是完整路线的简化版本:

var express = require('express');
var router = express.Router();
var pool = require('../modules/pg-pool'); // brings in pg-pool created in another module

// This route updates the availability for a user
router.put('/updateAvailability', async (req, res) => {
    var userId = req.decodedToken.userSQLId;
    var subvendorId = req.headers.subvendor_id;
    var availability = req.body;

    var queryStatement = 'UPDATE status SET status=$3 WHERE userId=$2';
    var queryArgumentsArray = [availability.status, userId ];

    try {
        var client = await pool.connect();
        await client.query(queryStatement, queryArgumentsArray);
        res.sendStatus(200);
    } catch (e) {
        console.log('Error updating subvendor availability data, UPDATE SQL query task', err);
        res.sendStatus(500);
    } finally {
        client && client.release && client.release();
    }
});

module.exports = router;

【问题讨论】:

  • 异常中没有行号吗?
  • 该代码看起来不错。这是确切的完整代码吗?您是否在其他任何地方使用术语client(grep 表示)?
  • @Bergi 正确,没有行号。我更新了完整的路线(我稍微简化了查询,因为它不是重点)。这里有什么线索吗?
  • @LukeSchlangen 尝试使用pg-promise。如果您不再看到问题,则问题出在 node-postgres 驱动程序内部。
  • 这真的很奇怪。您如何使用 ES8 async/await,使用转译器或原生转译器?如果是前者,也许我们应该看看转译输出。

标签: javascript node.js async-await try-catch


【解决方案1】:

所有功劳归于briancnode-postgres 的创建者node-postgres 的创建者,在我收到关于该库可能存在问题的建议(似乎不是)后,他在这里回答了我的问题。我只需要在try-catch之外创建客户端

var client = await pool.connect()
try {
  await client.query(...)
  res.sendStatus(200)
} catch { ...} 
finally {

}

他的完整答案可以在这里找到:https://github.com/brianc/node-postgres/issues/1301

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多