Node.js 入门教程
Node.js中文网
本文仅用于学习记录,不存在任何商业用途,如侵删
文章目录
- Node.js 入门教程
- 53 Node.js 开发环境与生产环境的区别
- 54 Node.js 中的错误处理
- 54.1 创建异常
- 54.2 错误对象
- 54.3 处理异常
- 54.4 捕获未捕获的异常
- 54.5 Promise 的异常
- 54.6 async/await 的错误处理
53 Node.js 开发环境与生产环境的区别
可以为生产环境和开发环境使用不同的配置。
Node.js 假定其始终运行在开发环境中。 可以通过设置 NODE_ENV=production
环境变量来向 Node.js 发出正在生产环境中运行的信号。
通常通过在 shell 中执行以下命令来完成:
export NODE_ENV=production
但最好将其放在的 shell 配置文件中(例如,使用 Bash shell 的 .bash_profile
),否则当系统重启时,该设置不会被保留。
也可以通过将环境变量放在应用程序的初始化命令之前来应用它:
NODE_ENV=production node app.js
此环境变量是一个约定,在外部库中也广泛使用。
设置环境为 production
通常可以确保:
- 日志记录保持在最低水平。
- 更高的缓存级别以优化性能。
例如,如果 NODE_ENV
未被设置为 production
,则 Express 使用的模板库 Pug 会在调试模式下进行编译。 Express 页面会在开发模式下按每个请求进行编译,而在生产环境中则会将其缓存。 还有更多的示例。
可以使用条件语句在不同的环境中执行代码:
if (process.env.NODE_ENV === "development") {
//...
}
if (process.env.NODE_ENV === "production") {
//...
}
if(['production', 'staging'].indexOf(process.env.NODE_ENV) >= 0) {
//...
})
例如,在 Express 应用中,可以使用此工具为每个环境设置不同的错误处理程序:
if (process.env.NODE_ENV === "development") {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }))
})
if (process.env.NODE_ENV === "production") {
app.use(express.errorHandler())
})
54 Node.js 中的错误处理
Node.js 中的错误通过异常进行处理。
54.1 创建异常
使用 throw
关键字创建异常:
throw value
一旦 JavaScript 执行到此行,则常规的程序流会被停止,且控制会被交给最近的异常处理程序。
通常,在客户端代码中,value
可以是任何 JavaScript 值(包括字符串、数字、或对象)。
在 Node.js 中,我们不抛出字符串,而仅抛出 Error 对象。
54.2 错误对象
错误对象是 Error 对象的实例、或者继承自 Error 类(由 Error 核心模块提供):
throw new Error('错误信息')
或:
class NotEnoughCoffeeError extends Error {
//...
}
throw new NotEnoughCoffeeError()
54.3 处理异常
异常处理程序是 try
/catch
语句。
try
块中包含的代码行中引发的任何异常都会在相应的 catch
块中处理:
try {
//代码行
} catch (e) {}
在此示例中,e
是异常值。
可以添加多个处理程序,它们可以捕获各种错误。
54.4 捕获未捕获的异常
如果在程序执行过程中引发了未捕获的异常,则程序会崩溃。
若要解决此问题,则监听 process
对象上的 uncaughtException
事件:
process.on('uncaughtException', err => {
console.error('有一个未捕获的错误', err)
process.exit(1) //强制性的(根据 Node.js 文档)
})
无需为此导入 process
核心模块,因为它是自动注入的。
54.5 Promise 的异常
使用 promise 可以链接不同的操作,并在最后处理错误:
doSomething1()
.then(doSomething2)
.then(doSomething3)
.catch(err => console.error(err))
你怎么知道错误发生在哪里?
你并不知道,但是你可以处理所调用的每个函数(doSomethingX
)中的错误,并且在错误处理程序内部抛出新的错误,这就会调用外部的 catch
处理程序:
const doSomething1 = () => {
//...
try {
//...
} catch (err) {
//... 在本地处理
throw new Error(err.message)
}
//...
}
为了能够在本地(而不是在调用的函数中)处理错误,则可以断开链条,在每个 then()
函数中创建函数并处理异常:
doSomething1()
.then(() => {
return doSomething2().catch(err => {
//处理错误
throw err //打断链条
})
})
.then(() => {
return doSomething2().catch(err => {
//处理错误
throw err //打断链条
})
})
.catch(err => console.error(err))
54.6 async/await 的错误处理
使用 async/await 时,仍然需要捕获错误,可以通过以下方式进行操作:
async function someFunction() {
try {
await someOtherFunction()
} catch (err) {
console.error(err.message)
}
}