我有一个数据库模块。我希望模块在第一次导入时进行检查,如果数据库模块无法连接到数据库则崩溃。快速失败,努力失败。
对于这个例子,我们将使用 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;
如您所见,我想让它测试一个原始查询,它捕获了一个错误,抛出了一个错误。
我只知道一种停止 Node 的方法,那就是调用process.exit(1)
。
这是唯一的方法吗?
最佳答案
由于在异步过程完成之前您不会知道结果,因此您实际上不能在导入 期间抛出错误。会晚一点。
那时,如果你想强行终止 Node,那么是的,process.exit
就可以了。但我强烈建议不要从模块内终止进程。该进程不属于该模块。
相反,我会让模块返回一个 promise ,该 promise 要么由您的实例解决,要么因错误而被拒绝。这确保了事情仍然在调用者的控制之下,同时迫使他们处理模块初始化的异步性质。
大概是这样的:
'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
});
关于javascript - 导出模块并在导入时抛出错误/停止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41872817/