首页 > 解决方案 > 为什么这个函数会抛出无法捕获的异常?

问题描述

这是对早期问题的重写/简化,甚至更加简化,但希望这次不会混淆。看这段代码:

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不喜欢它。我不明白为什么我仍然看到异常以及我需要做些什么来消除它。

标签: javascriptnode.jsasync-awaittry-catches6-promise

解决方案


推荐阅读