2017-01-26 155 views
2

我有一个数据库模块。我希望模块在第一次导入时进行检查,并在数据库模块无法连接数据库时崩溃。快速失败,努力失败。导入模块并抛出错误/导入时停止执行

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

由于在异步过程完成之前您不会知道结果,因此在导入期间实际上不会引发错误。这将是更晚。

在这一点上,如果你想强制终止节点,那么是的,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 
    });