我的代码
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) (使用
显示警告的创建位置) (节点:30437)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误的根源是在没有 catch 块的情况下抛出异步函数内部,或者拒绝未使用 .catch() 处理的 Promise。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志node --trace-warnings ...
(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝 ID:1) (节点:30437)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。--unhandled-rejections=strict
当您选择“查看所有员工”时,这是正在运行的行,随后会抛出错误消息。在本例中,这是因为有两种方法可以执行查询 - 要么使用内联回调(作为参数传入),要么使用 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;
});
问题是,当在
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)
`
要触发查询,我们可以这样做 在这里,使用 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();
}
}