
了解 require 會被緩存
我在上一節(jié)提到過 require 緩存,但有趣的是,我們可以有 module.exports 之外的代碼。例如,
console.log('I will not be cached and only run once, the first time')module.exports = () => { console.log('I will be cached and will run every time this module is invoked')}
知道一些代碼可能僅運行一次,你可以使用這種此功能作為優(yōu)勢。

總是檢查錯誤
Node 不是 Java。在 Java 中,你可以拋出錯誤,因為多數(shù)時候你會在這些錯誤發(fā)生時中止應用程序的執(zhí)行。在 Java 中,你可以通過一個單獨的 try ... catch 處理多個錯誤。
在 Node 中不是這樣。Node 使用事件循環(huán)和異步執(zhí)行,錯誤發(fā)生時會不屬于與處理代碼(比如 try...catch)不同的上下文中。下面的作法在 Node 中無效:
try { request.get('/accounts', (error, response)=>{ data = JSON.parse(response) })} catch(error) { // Will NOT be called console.error(error)}
不過 try...catch 仍然可以用于同步的 Node 代碼。對上面的代碼進行重構(gòu)之后就好多了:
request.get('/accounts', (error, response)=>{ try { data = JSON.parse(response) } catch(error) { // Will be called console.error(error) }})
如果我們不能將 request 調(diào)用放在 try...catch 塊中,我們就不能處理來自 request 的錯誤。Node 開發(fā)者采用提供包含 error 參數(shù)的回調(diào)來解決這個問題。這樣你需要在每個回調(diào)中手工處理錯誤。你需要檢查 error(確保它不是 null),然后將相應的錯誤消息顯示給用戶或者客戶端,并記錄下來。也可以通過調(diào)用棧中的 callback 往回傳(如果你有回調(diào),而且調(diào)用棧上還有另一個函數(shù))。
request.get('/accounts', (error, response)=>{ if (error) return console.error(error) try { data = JSON.parse(response) } catch(error) { console.error(error) }})
你還可以使用 okay 庫。你可以像下面的代碼那樣使用它來避免在無數(shù)的回調(diào)中手工檢查錯誤(你好,回調(diào)地獄)。
var ok = require('okay')request.get('/accounts', ok(console.error, (response)=>{ try { data =