(节点:30437)UnhandledPromiseRejectionWarning:错误:回调函数不适用于 Promise 客户端

问题描述 投票:0回答:3

我的代码

          connection.promise().query(sql, crit, (error) => {
            if (error) throw error;
            console.log(chalk.cyan.bold(`====================================================================================`));
            console.log(chalk.greenBright(`Role successfully created!`));
            console.log(chalk.cyan.bold(`====================================================================================`));
            viewAllRoles();
          });

(节点:30437)UnhandledPromiseRejectionWarning:错误:回调函数对 Promise 客户端不可用。 在 PromiseConnection.query (/Users/rachelmcgrath/Desktop/projects/employeeDatabase/node_modules/mysql2/promise.js:94:13) 在 viewAllEmployees (/Users/rachelmcgrath/Desktop/projects/employeeDatabase/server.js:122:24) 在/Users/rachelmcgrath/Desktop/projects/employeeDatabase/server.js:51:9 在 processTicksAndRejections (内部/process/task_queues.js:95:5) (使用

node --trace-warnings ...
显示警告的创建位置) (节点:30437)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误的根源是在没有 catch 块的情况下抛出异步函数内部,或者拒绝未使用 .catch() 处理的 Promise。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志
--unhandled-rejections=strict
(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝 ID:1) (节点:30437)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。

javascript promise callback inline
3个回答
2
投票

当您选择“查看所有员工”时,这是正在运行的行,随后会抛出错误消息。在本例中,这是因为有两种方法可以执行查询 - 要么使用内联回调(作为参数传入),要么使用 Promise(由查询函数调用返回);但是,它们不能同时使用,这就是上面的代码片段试图做的事情,也是抛出错误的原因。 换句话说,我们来看看这两种方法。首先,我们来看看内联回调。在此方法中,我们使用连接变量(不带 .promise()),然后使用两个参数调用查询:第一个是要执行的 SQL 语句,第二个是具有参数的匿名函数 - 一个用于 if抛出错误,另一个表示成功响应,以及从 MySQL 发回的数据。一旦 MySQL 数据完成检索数据,匿名函数将作为我们的回调。该方法可以类似如下编写:

方法 1:使用内联回调查询

connection.query(sql, (error, response) => {
    if (error) throw error;
    console.log("Response: ", response);
});

现在,我们可以包装connection.promise(),而不是使用connection.query(),它将返回一个PromiseConnection类实例,然后我们可以使用它的query()方法,该方法将返回一个Promise 。在这种情况下,由于我们使用的是 Node Promise,因此当我们执行 query() 时,我们只需要提供一个参数:我们希望运行的 SQL 语句。从那里,我们可以使用 .then 或 .catch 分别处理成功返回或错误。该方法可以类似如下编写:

方法 2:使用基于 Promise 的回调进行查询

    .then(([ rows ]) => {
        console.log("Response: ", rows);
    })
    .catch(error => {
        throw error;
    });

0
投票

问题是,当在

promise.()
上使用
.query()
方法时,您必须在 sql 查询之后使用
.then()
而不是回调函数。 (回调函数是作为参数传递给另一个函数的函数)

您现在编写代码的方式包括回调,因为函数作为查询的第三个参数传入

`

connection.promise().query(sql, crit, (error) => {
            if (error) throw error;
            console.log(chalk.cyan.bold(`====================================================================================`));
            console.log(chalk.greenBright(`Role successfully created!`));
            console.log(chalk.cyan.bold(`====================================================================================`));
            viewAllRoles();
          });

`

但是可以切换到以下内容(或类似的内容)以避免回调,从而能够使用

.promise()

`

connection.promise().query(sql, crit)
        .then((data) => {
        //function goes in here
        }).catch(err)

`


0
投票

要触发查询,我们可以这样做 在这里,使用 with pool,我们可以在与数据库连接的地方做出承诺。然后我们在触发/执行查询时还有其他承诺。然后释放连接。

const pool = require('path to db confg file');
const fireQuery = async (req, res) => {

//make a connection with db it should be a callback function where await promise settles
const connection = await pool.getConnection();
try {
    // fire query
    const results = await connection.execute("sql query");
    res.status(200).json(results);
    } finally {
    connection.release();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.