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

标签 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;

如您所见,我想让它测试一个原始查询,它捕获了一个错误,抛出了一个错误。

我只知道一种停止 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/

相关文章:

javascript - 如何在不使用 TeraWurfl 的情况下检测网站是否正在通过移动设备或计算机使用

node.js - 使用 requirejs 解决 Node 中的循环依赖

node.js - 从回调外部调用变量nodejs

javascript - 无法 console.log(req.flash ("error")) 和同时呈现消息

mysql - for循环和mysql Node 如何等待所有查询完成才能处理 View

javascript - Node js Express.编译错误

javascript - 不确定我是否有语法错误或代码错误

javascript - 无法让 jQuery 在图像后面滑动

javascript - 在 AtScript 中声明 Angular 2.0 装饰器的正确语法是什么?

javascript - 发现 Sequelize 循环依赖