javascript - 为什么这个函数会抛出无法捕获的异常?
问题描述
这是对早期问题的重写/简化,甚至更加简化,但希望这次不会混淆。看这段代码:
const mysql = require('mysql-await');
const dbPool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
port: 8889,
user: 'admin',
password: 'admin',
database: 'cslabelsportal',
socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock',
});
async function getUserByID(id) {
if (id) {
try {
const rows = await dbPool.awaitQuery(`SELECT * FROM users WHERE id = '${id}'`);
[user = null] = rows;
return user;
} catch (error) {
return null;
}
}
}
async function test() {
const user = await getUserByID(6);
}
test();
这是在 node.js 中运行的,但我几乎绕过了所有问题,问题仍然存在,所以我假设这与 node.js 处理事情的方式或......好吧,我不知道。我所知道的:
awaitQuery 是一个创建 Promise 并返回它的函数。当一切顺利时,它会解析 Promise,如果它抛出错误,应该捕获 throw 然后拒绝 Promise。我就是这样读到的:
awaitQuery(query, params) {
return new Promise((resolve, reject) => {
try {
if ( typeof params === `undefined` ) {
this.pool.query(query, (err, result) => {
if ( err )
throw err;
resolve(result);
});
} else {
this.pool.query(query, params, (err, result) => {
if ( err )
throw err;
resolve(result);
});
}
} catch ( err ) {
reject(err);
}
});
}
函数 getUserByID 使用 await,它应该等到该 Promise 被解决,然后“如果 Promise 被拒绝,则等待表达式抛出被拒绝的值”。因此,如果出现问题,应该在 getUserByID 中创建一个异常。该异常应该可以在该函数的 try...catch 块中捕获。
除了结果是这样的:
...code/node_modules/mysql-await/index.js:505
throw err;
^
Error: connect ENOENT /Applications/MAMP/tmp/mysql/mysql.sock
at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1137:16)
--------------------
at ...code/node_modules/mysql-await/index.js:503:21
at new Promise (<anonymous>)
at PoolAwait.awaitQuery (...code/node_modules/mysql-await/index.js:500:12)
at getUserByID (...code/test/server.js:16:33)
at test (...code/test/server.js:26:22) {
errno: 'ENOENT',
code: 'ENOENT',
syscall: 'connect',
address: '/Applications/MAMP/tmp/mysql/mysql.sock',
fatal: true
}
首先导致错误的事实是完全正确的,如果您关闭数据库,mysql不喜欢它。我不明白为什么我仍然看到异常以及我需要做些什么来消除它。
解决方案
推荐阅读
- node.js - 如何在 Google Action 中拦截“停止”mediaObjects 意图
- c++ - 如果多个线程运行,Winsock 连接调用崩溃,在一个线程中工作正常?
- jsf - 手风琴面板选项卡中的 p:commandButton 不更新数据表
- python - fmin python 传递参数
- c# - 如何在 ASP.Net Core 2.x 的操作过滤器中获取配置、Cookie 和 DBContext
- r - 总结平均中值数据框 R
- google-app-maker - Google App Maker 日历示例。getCalendarByName 而不是 getDefaultCalendar
- vb.net - 如何仅限制 VB.Net 中的某些设置?
- python - 向python中的字典键添加多个值?
- apache - 如何在烧瓶重定向调用中保留请求网址