• Node.js 入门教程 53 Node.js 开发环境与生产环境的区别 & 54 Node.js 中的错误处理


    Node.js 入门教程

    Node.js官方入门教程

    Node.js中文网

    本文仅用于学习记录,不存在任何商业用途,如侵删

    53 Node.js 开发环境与生产环境的区别

    可以为生产环境和开发环境使用不同的配置。

    Node.js 假定其始终运行在开发环境中。 可以通过设置 NODE_ENV=production 环境变量来向 Node.js 发出正在生产环境中运行的信号。

    通常通过在 shell 中执行以下命令来完成:

    export NODE_ENV=production
    
    • 1

    但最好将其放在的 shell 配置文件中(例如,使用 Bash shell 的 .bash_profile),否则当系统重启时,该设置不会被保留。

    也可以通过将环境变量放在应用程序的初始化命令之前来应用它:

    NODE_ENV=production node app.js
    
    • 1

    此环境变量是一个约定,在外部库中也广泛使用。

    设置环境为 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) {
      //...
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    例如,在 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())
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    54 Node.js 中的错误处理

    Node.js 中的错误通过异常进行处理。

    54.1 创建异常

    使用 throw 关键字创建异常:

    throw value
    
    • 1

    一旦 JavaScript 执行到此行,则常规的程序流会被停止,且控制会被交给最近的异常处理程序。

    通常,在客户端代码中,value 可以是任何 JavaScript 值(包括字符串、数字、或对象)。

    在 Node.js 中,我们不抛出字符串,而仅抛出 Error 对象。

    54.2 错误对象

    错误对象是 Error 对象的实例、或者继承自 Error 类(由 Error 核心模块提供):

    throw new Error('错误信息')
    
    • 1

    或:

    class NotEnoughCoffeeError extends Error {
      //...
    }
    throw new NotEnoughCoffeeError()
    
    • 1
    • 2
    • 3
    • 4
    54.3 处理异常

    异常处理程序是 try/catch 语句。

    try 块中包含的代码行中引发的任何异常都会在相应的 catch 块中处理:

    try {
      //代码行
    } catch (e) {}
    
    • 1
    • 2
    • 3

    在此示例中,e异常值

    可以添加多个处理程序,它们可以捕获各种错误。

    54.4 捕获未捕获的异常

    如果在程序执行过程中引发了未捕获的异常,则程序会崩溃。

    若要解决此问题,则监听 process 对象上的 uncaughtException 事件:

    process.on('uncaughtException', err => {
      console.error('有一个未捕获的错误', err)
      process.exit(1) //强制性的(根据 Node.js 文档)
    })
    
    • 1
    • 2
    • 3
    • 4

    无需为此导入 process 核心模块,因为它是自动注入的。

    54.5 Promise 的异常

    使用 promise 可以链接不同的操作,并在最后处理错误:

    doSomething1()
      .then(doSomething2)
      .then(doSomething3)
      .catch(err => console.error(err))
    
    • 1
    • 2
    • 3
    • 4

    你怎么知道错误发生在哪里?

    你并不知道,但是你可以处理所调用的每个函数(doSomethingX)中的错误,并且在错误处理程序内部抛出新的错误,这就会调用外部的 catch 处理程序:

    const doSomething1 = () => {
      //...
      try {
        //...
      } catch (err) {
        //... 在本地处理
        throw new Error(err.message)
      }
      //...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    为了能够在本地(而不是在调用的函数中)处理错误,则可以断开链条,在每个 then() 函数中创建函数并处理异常:

    doSomething1()
      .then(() => {
        return doSomething2().catch(err => {
          //处理错误
          throw err //打断链条
        })
      })
      .then(() => {
        return doSomething2().catch(err => {
          //处理错误
          throw err //打断链条
        })
      })
      .catch(err => console.error(err))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    54.6 async/await 的错误处理

    使用 async/await 时,仍然需要捕获错误,可以通过以下方式进行操作:

    async function someFunction() {
      try {
        await someOtherFunction()
      } catch (err) {
        console.error(err.message)
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    1768.交替合并字符串
    WebGPU缓冲区更新最佳实践
    如何搭建接口自动化测试框架?
    C语言实验八 字符数组程序设计
    Prometheus 基本概念
    qt之实现鼠标操作子控件移动窗体(亲测简单好用,有问题私聊)
    React知识总结✨
    ROS系统通过类定义实现数据处理并重新发布在另一话题
    Qt5开发及实例V2.0-第十三章-Qt数据库
    netsh interface portproxy端口转发,从本地端口到本地端口不起作用的解决办法
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128108569