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日

相关文章

  • node中使用es6/7/8(支持性与性能)

    在Node中使用ES6/7/8语法需要经过一些配置和使用相关的工具,下面是具体的步骤: 1. 安装工具 安装babel和babel-cli,可用以下命令: $ npm install –save-dev babel babel-cli $ npm install –save-dev babel-preset-env 其中,babel-preset-env…

    node js 2023年6月8日
    00
  • NodeJs读取JSON文件格式化时的注意事项

    当我们需要在NodeJS中读取JSON格式的文件时,需要注意以下几点: 1. 确定文件路径和编码格式 读取JSON文件前需要确定文件的正确路径和编码格式。可以通过以下方法来确定文件路径: const path = require(‘path’); const filePath = path.join(__dirname, ‘path/to/json/file…

    node js 2023年6月8日
    00
  • JavaScript中使用Async实现异步控制

    下面是详细的讲解「JavaScript中使用Async实现异步控制」的完整攻略。 异步编程 在JavaScript中,异步编程是相当重要的,它涉及到不少实际开发场景下的问题,如网络请求、文件读写等等。如果不掌握异步编程,会导致代码的执行顺序不如预期,引起各种奇怪的问题。 异步编程有许多解决方案,其中之一是异步函数(Async Functions),也叫做As…

    node js 2023年6月8日
    00
  • 原生js实现的移动端可拖动进度条插件功能详解

    下面我将为您详细讲解 “原生js实现的移动端可拖动进度条插件功能详解” 的完整攻略。 插件功能介绍 本插件是一个移动端可拖动进度条插件,能够在移动端非常友好地实现拖动操作,并且可以支持自定义前景色、后景色等。通过本插件,我们可以快速地为我们的移动端网页添加进度条的功能,大大提升了用户体验度。 实现思路 本插件的实现主要是通过原生JS来实现的,其具体实现思路如…

    node js 2023年6月8日
    00
  • 详解一些适用于Node.js的命名约定

    详解一些适用于Node.js的命名约定 在Node.js开发过程中,良好的命名约定可以使代码易于维护和扩展。下面介绍一些适用于Node.js的命名约定: 文件名命名约定 在Node.js开发中,最常用的文件名的命名约定是使用小写字母和短横线分隔符。这种命名约定被称为“kebab-case”。例如,一个JavaScript模块的文件名应该像这样:my-modu…

    node js 2023年6月8日
    00
  • Vue报错Syntax Error:TypeError: this.getOptions is not a function的解决方法

    当出现“Vue报错Syntax Error:TypeError: this.getOptions is not a function”的错误提示时,通常是由于在Vue项目中使用了未定义的方法或属性,导致代码无法正常运行。以下是解决这个错误的完整攻略。 确认使用了正确的Vue版本 如果你使用的是Vue 2.x版本,那么有可能是因为你在组件中使用了Vue 3.x…

    node js 2023年6月8日
    00
  • Javascript的IE和Firefox兼容性汇编(zz)

    Javascript的IE和Firefox兼容性汇编(zz) 1. 前言 由于不同浏览器的Javascript解释器存在差异,会导致在不同浏览器中相同的Javascript代码表现不同。因此,了解不同浏览器中Javascript解释器的差异,掌握浏览器的兼容性问题是Javascript开发过程中必须要面对的问题。 本文将介绍Javascript在IE和Fir…

    node js 2023年6月8日
    00
  • 浅谈Node模块系统及其模式

    浅谈Node模块系统及其模式 什么是Node模块系统 Node模块系统是指Node.js中内置的模块加载和使用机制。Node采用了CommonJS模块规范来管理模块并组织代码,一个Node.js应用程序通常由多个模块组成,每个模块都有自己单独的作用域和命名空间。Node模块系统支持两种类型的模块:核心模块和文件模块。其中,核心模块是Node内部提供的模块,由…

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