了解 require 会被缓存
我在上一节提到过 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')}
知道一些代码可能仅运行一次,你可以使用这种此功能作为优势。
Tocy翻译于 1天前0人顶 翻译得不错哦!总是检查错误
Node 不是 Java。在 Java 中,你可以抛出错误,因为多数时候你会在这些错误发生时中止应用程序的执行。在 Java 中,你可以通过一个单独的 try ... catch 处理多个错误。
在 Node 中不是这样。Node 使用事件循环和异步执行,错误发生时会不属于与处理代码(比如 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 代码。对上面的代码进行重构之后就好多了:
request.get('/accounts', (error, response)=>{ try { data = JSON.parse(response) } catch(error) { // Will be called console.error(error) }})
如果我们不能将 request 调用放在 try...catch 块中,我们就不能处理来自 request 的错误。Node 开发者采用提供包含 error 参数的回调来解决这个问题。这样你需要在每个回调中手工处理错误。你需要检查 error(确保它不是 null),然后将相应的错误消息显示给用户或者客户端,并记录下来。也可以通过调用栈中的 callback 往回传(如果你有回调,而且调用栈上还有另一个函数)。
request.get('/accounts', (error, response)=>{ if (error) return console.error(error) try { data = JSON.parse(response) } catch(error) { console.error(error) }})
你还可以使用 okay 库。你可以像下面的代码那样使用它来避免在无数的回调中手工检查错误(你好,回调地狱)。
var ok = require('okay')request.get('/accounts', ok(console.error, (response)=>{ try { data =