承诺中的exception处理

有时候构造一个承诺可能会有一个例外的情况,如数据库拒绝连接或数据库的无效主机名参数,例如:

在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 

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

你不处理connect调用中的错误。 用***注释看线条:

 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将捕获发生的同步错误,但通过callbackconnect报告成功/失败。 更多在npm mysql文档 。

当然,就像trincot指出的那样 ,在使用点处理拒绝处理程序。