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

yizhihongxing

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日

相关文章

  • 浅析Nodejs npm常用命令

    我将为您详细讲解“浅析Nodejs npm常用命令”的完整攻略。 一、 什么是npm? npm是Node.js的包管理工具,它能够帮助我们安装、管理依赖,以及发布我们自己的包。 二、npm常用命令 1. npm init npm init命令可以让我们创建一个新的package.json文件,这个文件是用来描述我们的项目的,可以在这个文件中设置项目的基本信息…

    node js 2023年6月8日
    00
  • node强缓存和协商缓存实战示例

    我来为您讲解 “Node强缓存和协商缓存实战示例”的攻略。 强缓存 强缓存是指在缓存数据时,客户端直接使用缓存,而不再发起请求。要使用强缓存,需要设置响应头中的 Cache-Control 或 Expires。 Cache-Control 通过设置 Cache-Control 为 max-age 或 s-maxage 可以实现强缓存。其中,max-age 是…

    node js 2023年6月8日
    00
  • node实现mock-plugin中间件的方法

    Node.js是一个可以运行JavaScript的开发平台,可以用它来实现服务器端的编程,也可以使用它来开发命令行工具。Mock-plugin中间件是一个常用的Web前端开发工具,可以提供本地开发时的Mock数据服务,Webpack、Gulp、Grunt、Browserify等开源工具可以通过在构建阶段注入插件的方式实现Mock功能。 以下是实现Node实现…

    node js 2023年6月8日
    00
  • ES10 特性的完整指南小结

    ES10 特性的完整指南小结 ECMAScript 2019 (ES10) 是Javascript的第十代标准,为Javascript增加了一些新的特性和语法。本文将对ES10的主要新增特性进行介绍。 Array.prototype.flat() Array.prototype.flat() 方法可以将一个多维数组变成一个一维数组。它接收一个可选参数dept…

    node js 2023年6月8日
    00
  • Nodejs 和Session 原理及实战技巧小结

    针对“Nodejs 和Session 原理及实战技巧小结”的完整攻略,我将从以下几个方面进行详细讲解: 什么是Node.js和Session Node.js与Session的原理 Session的使用技巧以及相关注意事项 Node.js中Session的实现案例 一、什么是Node.js和Session Node.js是一种服务器端运行环境,让JavaScr…

    node js 2023年6月8日
    00
  • 浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)

    浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤) 背景介绍 本文主要讲解Node.js中的一个安全漏洞CVE-2017-14849,该漏洞可以被利用来绕过Node.js的沙箱,从而获取系统权限。该漏洞存在于Node.js v8.5.0版本中,由于该漏洞的危害性较高,因此被称为“沙箱逃逸漏洞”。 漏洞分析 漏洞的成因 利用该漏洞需要理解N…

    node js 2023年6月8日
    00
  • mongoose设置unique不生效问题的解决及如何移除unique的限制

    当使用 Mongoose 建立文档时,我们经常使用 unique 属性来保证某些字段的唯一性。但是,在实际开发过程中,我们可能会遇到设置了 unique 但并没有起到限制作用的问题。以下是 mongoose 设置 unique 不生效问题的解决方案及如何移除 unique 限制的攻略。 问题分析 在 Mongoose 中设置的 unique 属性不起作用,通…

    node js 2023年6月8日
    00
  • Angular CLI 安装和使用教程

    Angular CLI 安装和使用教程 Angular CLI是Angular官方提供的命令行工具,它可以帮助我们更加便捷地创建、构建和管理一个Angular应用。本文将详细讲解Angular CLI的安装和使用教程。 安装Angular CLI 要使用Angular CLI,首先需要安装它。在安装前需要先安装Node.js和npm。 在命令行工具中输入以下…

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