【发布时间】:2020-03-01 22:55:28
【问题描述】:
我是 Javascript Promises 的新手。我正在尝试以基于 Promises 的样式执行 MySQL 查询,我已经摸不着头脑了半个多小时,但我仍然无法在这段代码中找到问题。我使用this article 作为参考。
mysql 文件
const mysql = require('mysql')
const Config = require('./Config.js');
let connection = mysql.createPool({
connectionLimit: Config.mysql.connectionLimit,
host: Config.mysql.host,
user: Config.mysql.user,
password: Config.mysql.password,
database: Config.mysql.database,
multipleStatements: true,
});
module.exports = {
query: function(query, binds) {
return new Promise((resolve, reject)=>{
connection.query(query, binds, (error, ret)=>{
if(error)
return reject(error);
else
resolve(ret);
})
})
},
close: function() {
return new Promise((resolve, reject)=>{
connection.end((error)=>{
if(error)
return reject(error);
else
resolve();
});
});
}
}
实际脚本
const Mysql = require('mysql file');
try {
Mysql.query("SELECT `password` \
FROM `m_users` \
WHERE `email` = ?",
['user@domain.tld'])
.then(ret=>{
if(ret.email)
return res.send({
params: req.body,
message: 'Email address has already been taken.',
})
})
.catch(error=>{
throw error;
})
catch( e )
{
console.log(e); // is never reached
}
throw error 永远不会被解雇。相反,在我的节点控制台中,我收到以下错误:
(节点:8684)UnhandledPromiseRejectionWarning:错误:ER_NO_SUCH_TABLE:表“forge.m_users”不存在
........在这里回溯.......
(node:8684) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1)
我知道该表不存在。我有兴趣找出为什么.catch 不处理错误。我究竟做错了什么? :/
【问题讨论】:
-
throw error is never fired你确定吗?该语句将创建一个未处理的拒绝。仔细检查该行是否正在运行 - 在其上方放置console.log或其他内容 -
你是对的 - 它被解雇了。我迷路了;我应该如何处理拒绝?我已经有一个包含整个过程的 try/catch 块(请参阅更新的答案)
-
@user8555937 - 在非
async函数中,try/catch无法捕获 Promise 拒绝,因为当 Promise 被拒绝时,执行已经离开了 @987654331 @块。
标签: javascript node.js promise