NodeJS开发人员常见五个错误理解

NodeJS开发人员常见五个错误理解

1. Node.js 是单线程的,一定不会出现并行执行的情况

这是一个非常常见的错误理解,实际上 Node.js 并不是单线程的,它的事件循环机制可以充分利用多核 CPU 资源来并行执行代码。但是由于 Node.js 中的 I/O 操作都是异步非阻塞的,因此如果不加注意,在异步操作没有完成之前,事件循环会直接进入下一步操作,这会导致异步操作的结果无法预测,从而造成一些错误。

示例1:

for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i)
  }, 1000)
}

预期输出为:0 1 2 3 4

实际输出为:5 5 5 5 5

因为在事件循环的过程中,for 循环执行完毕后,i 已经变成了 5,而在 1 秒后打印 i 的值,因此输出了 5 个 5。

示例2:

const fs = require('fs')

fs.readFile('./file1.txt', (err, data1) => {
  if (err) throw err
  console.log(data1.toString())
})

fs.readFile('./file2.txt', (err, data2) => {
  if (err) throw err
  console.log(data2.toString())
})

由于 fs.readFile 是异步的,并且是非阻塞的,因此在读取 file1.txt 和 file2.txt 的过程中,是同时进行的,但它们的完成顺序是无法预测的。因此,输出结果也是无法预测的。

2. 回调函数中的异步操作会按照定义的顺序执行

这是另一个常见的错误理解,实际上,在回调函数中定义的异步操作,是不会按照定义的顺序执行的。相反,由于 JavaScript 的异步机制,它们可能会在任何时候完成,这取决于它们的执行时间和当前事件循环的状态。

示例:

function fetchData(id, cb) {
  setTimeout(() => {
    console.log(`fetch data ${id} completed`)
    cb()
  }, Math.random() * 1000)
}

function fetchDataList() {
  [1, 2, 3, 4, 5].forEach((id) => {
    fetchData(id, () => {
      console.log(`handle data ${id}`)
    })
  })
}

fetchDataList()

由于每次调用 fetchData 时,都是使用了随机生成的延迟执行时间,因此输出的顺序是无法确定的。可能的输出结果如下:

fetch data 1 completed
fetch data 3 completed
handle data 1
fetch data 5 completed
handle data 3
fetch data 2 completed
handle data 5
fetch data 4 completed
handle data 2
handle data 4

3. Node.js 不需要异常处理,可以直接用 throw 抛出异常

这是一个非常危险的错误理解,实际上 Node.js 中的异常必须处理,否则可能导致程序崩溃或者数据丢失。如果在回调函数中使用 throw 抛出异常,会直接导致程序崩溃,如果在错误处理中没有处理好异常,也会导致程序崩溃。

示例:

const fs = require('fs')

fs.readFile('./file.txt', (err, data) => {
  if (err) throw err // 这里抛出异常会导致程序崩溃
  console.log(data.toString())
})

正确的异常处理方式应该是在错误处理中使用 console.error 输出错误信息,并使用 return 或者调用回调函数传递错误信息。示例:

const fs = require('fs')

fs.readFile('./file.txt', (err, data) => {
  if (err) {
    console.error(err)
    return
  }
  console.log(data.toString())
})

4. 不需要手工关闭文件和数据库连接,Node.js 会自动关闭它们

这是一个常见的错误理解,并不是所有的 Node.js 模块都会自动关闭它们打开的文件和数据库连接,因此必须手工关闭它们。如果没有手工关闭它们,会导致文件描述符泄漏、数据库连接数增加等问题,从而导致程序崩溃或者资源耗尽。

示例:

const fs = require('fs')

const readStream = fs.createReadStream('./file.txt')
readStream.pipe(process.stdout)

// 必须手工关闭 readStream
readStream.on('close', () => {
  console.log('readStream closed')
})

5. 使用 console.log 输出日志就足够了

这也是一个常见的错误理解,实际上使用 console.log 可以输出简单的文本日志信息,但是在复杂的项目中,往往需要更加强大、灵活的日志功能。因此,建议使用专业的日志框架,例如 bunyan、winston 等,它们可以帮助开发人员实现一些高级日志功能,例如日志滚动、日志分级、日志归档等。

示例:

const bunyan = require('bunyan');

const logger = bunyan.createLogger({name: 'myapp'});

logger.info('hello world');

上面的代码使用了 bunyan 日志框架,输出了一个简单的日志信息。bunyan 支持非常灵活的日志配置和输出,可以满足各种复杂的项目需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS开发人员常见五个错误理解 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • JavaScript中的垃圾回收与内存泄漏示例详解

    JavaScript中的垃圾回收与内存泄漏示例详解 垃圾回收 JavaScript是一种高级语言,它使用垃圾回收机制来管理内存。垃圾回收机制是一种自动化的功能,可以检测和删除不再使用的对象,从而释放占用的内存。 在JavaScript中,垃圾回收机制有两种:标记清除和引用计数。标记清除是JavaScript引擎中最常用的垃圾回收机制,它遍历所有的对象并标记它…

    node js 2023年6月8日
    00
  • nodejs简单实现中英文翻译

    Node.js简单实现中英文翻译:完整攻略 什么是Node.js? Node.js是一种基于Chrome V8 JavaScript引擎构建的JavaScript运行环境,用于开发高性能、可扩展的网络应用程序。 前置知识 在实现中英文翻译的过程中,需要了解以下知识: Node.js基本语法 Express框架 网络基础知识(HTTP协议) 实现步骤 步骤1:…

    node js 2023年6月8日
    00
  • node作为中间服务层如何发送请求(发送请求的实现方法详解)

    当我们开发前端应用时,有时需要向后端服务器发送请求获取数据,并将数据展示在页面上。但是在实际开发中,直接向后端服务器发送请求可能存在一些问题,例如跨域、频繁请求等问题。因此,我们可以使用node作为中间服务层,来发送请求。 Node.js中有一些第三方模块可以用于发送请求,比如: axios:一个基于Promise的HTTP客户端,可以用于发送GET、POS…

    node js 2023年6月8日
    00
  • 详解支持Angular 2的表格控件

    接下来我将详细讲解 “详解支持Angular 2的表格控件” 的完整攻略。 1. 引入表格控件 在 Angular 2 的项目中,你可以使用一些第三方的表格控件来解决数据展示的需要,例如: ng2-smart-table ngx-datatable ag-grid 以 ng2-smart-table 为例,你可以通过 npm 命令安装该控件: npm ins…

    node js 2023年6月8日
    00
  • 详解Node.js access_token的获取、存储及更新

    详解Node.js access_token的获取、存储及更新 在开发微信公众号等基于微信平台的应用时,我们通常需要使用access_token进行接口调用。本文将详细介绍Node.js获取、存储和更新access_token的完整攻略。 获取access_token 获取access_token需要向微信服务器发送GET请求,具体的接口地址为: https…

    node js 2023年6月8日
    00
  • node执行cmd或shell命令使用介绍

    Node.js提供了child_process模块来执行cmd或shell命令。在本攻略中,我将介绍如何使用Node.js的child_process模块来执行cmd或shell命令。下面是完整攻略的步骤: 1. 引入child_process模块 在使用child_process模块之前,需要先引入该模块。可以在文件顶部添加以下代码引入child_proc…

    node js 2023年6月8日
    00
  • 宝塔部署nodejs项目的实战步骤

    下面是宝塔部署Node.js项目的实战步骤: 1. 在宝塔面板上安装Node.js环境 打开宝塔面板,找到“软件商店”,搜索“Node.js”。 在搜索结果中点击“安装”按钮进行安装。 2. 上传Node.js项目到宝塔网站目录 在宝塔面板中找到需要部署的网站,点击进入。 找到网站目录所在位置,在目录下新建一个文件夹,命名为“node”。 将本地Node.j…

    node js 2023年6月8日
    00
  • 详解Node.js异步处理的各种写法

    详解Node.js异步处理的各种写法 什么是异步处理 在Node.js中,异步处理是指在JavaScript代码中,处理I/O操作和其他耗时的操作时,应该尽可能的避免阻塞I/O和JavaScript线程。在Node.js中,异步操作是通过回调函数和事件来实现的。 回调函数 回调函数是一种在异步代码中通知结果的机制。当异步操作完成时,将调用回调函数来获得异步操…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部