【问题标题】:Exception handling in promisesPromise 中的异常处理
【发布时间】:2018-02-18 17:12:36
【问题描述】:

有时构造promise可能会出现数据库拒绝连接或数据库主机名参数无效等异常情况,例如:

在 db.js 中

const mysql = require('mysql');

module.exports.connect = (options) => {
  return new Promise((resolve, reject) => {
    try {
      const connection = mysql.createConnection(getDBConfig());
      connection.connect();
      resolve(connection);
    } catch (err) {
      throw new Error('Error connecting database');
    }
  });
};

function getDBConfig() {
  const isProd = process.env.NODE_ENV === 'production';
  const config = {
    debug: !isProd,
    host: 'localhost',
    user: 'root',
    database: 'xxx'
  };

  if (isProd) {
    return Object.assign({
      password: 'root'
    }, config);
  } else {
    return Object.assign({
      password: 'xxx'
    }, config);
  }
}

在 app.js 中

'use strict';

const database = require('./db');
const server = require('./server');

// log unhandled execpetions
process.on('uncaughtException', (err) => {
  console.error('Unhandled Exception', err.message);
});

process.on('uncaughtRejection', (err, promise) => {
  console.error('Unhandled Rejection', err);
});

database.connect({
})
.then((connection) => {
  console.log('Connected to database');
});

在上述情况下,没有运行mysql的实例,我在控制台中得到的输出是:

Connected to database
Unhandled Exception connect ECONNREFUSED 127.0.0.1:3306

这不是预期的,我需要知道推荐的方法是什么以及我在这里做错了什么?

【问题讨论】:

    标签: javascript mysql node.js express promise


    【解决方案1】:

    您没有处理 connect 调用中的错误。请参阅带有*** cmets 的行:

    module.exports.connect = (options) => {
      return new Promise((resolve, reject) => {
        try {
          const connection = mysql.createConnection(getDBConfig());
          connection.connect(err => {                         // ***
            if (err) {                                        // ***
              reject(new Error('Error connecting database')); // ***
            } else {                                          // ***
              resolve(connection);                            // ***
            }                                                 // ***
          });                                                 // ***
        } catch (err) {
          throw new Error('Error connecting database');
        }
      });
    };
    

    try/catch 将捕获发生的同步错误,但connect 通过回调报告成功/失败。更多内容请关注npm mysql documentation。

    当然,然后处理在使用时使用catch 处理程序作为trincot pointed out 处理拒绝。

    【讨论】:

    • @codeyogi 导致它在连接之前解析。连接是异步的...
    • 哦,知道了。当try/catch 运行时没有错误,但由于connect 的异步性质,稍后会引发错误。
    • 你能帮我理解这个流程还是让我参考一些文档?
    • @CodeYogi:流程是:您创建一个连接对象并调用其connect 方法,该方法启动连接过程,但异步处理它。 稍后,它会异步调用你给它的回调,传递一个错误或null 作为第一个参数。你看那个(上面的err)来决定是解决还是拒绝你的承诺。更多关于连接的流程等,在the mysql package documentation.
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2021-05-18
    相关资源
    最近更新 更多