导出模块并引发错误/停止执行导入

我有一个数据库模块。 我希望模块在首次导入时进行检查,如果数据库模块无法连接到数据库,则会导致崩溃。 快速失败,难以成功。

对于这个例子,我们将使用knex,但问题是真正的任何模块或任何情况。

database.js文件:

 'use strict'; import knex from 'knex'; const instance = knex({ client: 'mysql', connection: { database: 'myDatabase', host: 'host_that_does_not_exist', password: '', port: 3306, user: 'bob' } }); instance.raw('select 1+1 as result').catch(err => { throw new Error('Database connection was not found', err); }); export default instance; 

正如你所看到的,我想要它testing一个原始查询,并捕获一个错误,抛出一个错误。

我只知道一个停止节点的方法,那就是调用process.exit(1)

这是做这个的唯一方法吗?

由于在asynchronous过程完成之前您不会知道结果,所以导入过程中实际上不会发生错误。 那会晚一些。

在这一点上,如果你想强制终止节点,那么是的, process.exit会做到这一点。 但我强烈build议不要从模块中终止进程。 该过程不属于该模块。

相反,我会让这个模块返回一个承诺,这个承诺或者用你的实例解决,或者被一个错误拒绝。 这可以确保事情保持在调用者的控制之下,同时强制他们处理模块init的asynchronous特性。

有点模糊的东西:

 'use strict'; import knex from 'knex'; const instance = knex({ client: 'mysql', connection: { database: 'myDatabase', host: 'host_that_does_not_exist', password: '', port: 3306, user: 'bob' } }); const modulePromise = instance.raw('select 1+1 as result') .then(() => instance) .catch(err => { throw new Error('Database connection was not found', err); }); export default modulePromise; 

哪个来电者会这样使用:

 import niftyModulePromise from "./your-module"; niftyModulePromise .then(module => { // Use it }) .catch(err => { // Handle it -- process exit if desired });