导出模块并在导入时抛出错误/停止执行

时间:2017-01-26 11:49:04

标签: javascript node.js

我有一个数据库模块。我希望模块在第一次导入时进行检查,如果数据库模块无法连接到数据库,则会崩溃。快失败,努力失败。

对于这个例子,我们将使用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)

这是唯一的方法吗?

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
    });