2017-01-26 8 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; 

、それは生のクエリをテストするために私が欲しい、それがエラーをキャッチされ、エラーをスローします。

私はノードを停止する方法の1つしか知らず、それはprocess.exit(1)を呼び出すことです。

これは唯一の方法ですか?

答えて

1

非同期処理が完了するまで結果がわからないので、インポート中に実際にはエラーをスローすることはできません。それは後になります。

この時点で、Nodeを強制終了したい場合はyes、process.exitとなります。しかし、私はを強くモジュール内からプロセスを終了しないことをお勧めします。プロセスはモジュールによって所有されていません。

代わりに、モジュールはインスタンスで解決されるか、エラーで拒否された約束を返します。これにより、呼び出し元の制御下にあるものが確実に保持され、モジュールinitの非同期性を処理するようになります。

漠然とこのような何か:

import niftyModulePromise from "./your-module"; 
niftyModulePromise 
    .then(module => { 
     // Use it 
    }) 
    .catch(err => { 
     // Handle it -- process exit if desired 
    }); 
:呼び出し側がこのように使用する

'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; 

...

関連する問題