2017-01-26 206 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 
    });