我有一个数据库模块。我希望模块在第一次导入时进行检查,如果数据库模块无法连接到数据库,则会崩溃。快失败,努力失败。
对于这个例子,我们将使用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;
如您所见,我希望它能够测试一个原始查询并且它会捕获错误,抛出错误。
我只知道一种停止节点的方法,那就是调用process.exit(1)
。
这是唯一的方法吗?
答案 0 :(得分:1)
由于在完成异步处理之前您不知道结果,因此在导入期间实际上无法引发错误。会晚点。
此时,如果你想强制终止Node,那么是的,process.exit
会这样做。但我强烈建议不要在模块中终止进程。该过程不归模块所有。
相反,我让模块返回一个承诺,该承诺可以通过您的实例解决,也可以通过错误拒绝。这可以确保在强制它们处理模块init的异步性质时,事物仍然处于调用者的控制之下。
像这样模糊的东西:
'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
});