node.js的常用内置库(1)共128节

本文介绍了Node.js中的三个重要模块:assert用于断言和测试,async_hooks追踪异步回调,以及Buffer处理二进制数据。通过实例演示了如何在实际开发中使用这些工具以提升代码质量和性能。
摘要由CSDN通过智能技术生成

我说假如node.js 一路杀出,成为一种后端主要选型的时候,你再次去了解晚么,不晚,但给你的时间肯定不多~😄 跟着我一起开始认识node吧,今日份不多3个API ,加油

1.assert

 在 Node.js 环境中开发时,质量不容忽视。为提高代码的健壮,我们经常需要断言工具来进行代码校验。Node.js 内建的断言库,即 assert 模块,充当了自动化测试和异常检测中的关键角色。断言是指一种预期表达式应始终为真的测试方法。如果遇到断言为假的情况,就会引发错误,这有助于开发者迅速识别问题所在。

引入:

const assert = require('assert');

断言函数:

  1. assert.ok(value, [message]): 要求 value 为真。如果为假,将抛出一个附有 message 的错误。
  2. assert.strictEqual(actual, expected, [message]): 验证 actual 和 expected 的值是否严格相等,不进行类型转换。
  3. assert.deepEqual(actual, expected, [message]): 验证 actual 和 expected 是否在值上相等,即使它们是不同类型的数据,也会尝试类型转换。
  4. assert.throws(block, [error], [message]): 验证 block 函数是否会引发错误,并可以指定期待错误类型的 error 。
  5. assert.doesNotThrow(block, [error], [message]): 验证 block 函数是否不会引发错误。

使用方法:

 

const assert = require('assert');
const express = require('express');
 
const app = express();
 
app.get('/', (req, res) => {
  res.send('Hello, I am learning Node.js assert!');
});
 
const server = app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
 
// 测试的用例
assert.ok(server !== undefined, 'Server is error');
assert.strictEqual(1 + 1, 2, '1 + 1 should be equal to 2');
 
console.log('All tests passed');

2.async_hooks

 async_hooks 模块是在 v8.0.0 版本正式加入 Node.js 的实验性 API。什么是 async_hooks 呢?async_hooks 提供了追踪异步资源的 API,这种异步资源是具有关联回调的对象。简而言之,async_hooks 模块可以用来追踪异步回调。

node 基于事件循环的异步非阻塞 I/O 模型,发起一次异步调用,回调在之后的循环中才被调用,此时已经无法追踪到是谁发起了这个异步调用,无法从日志中确认调用链。

用法:

// 监听 fs.readFile 异步回调

const fs = require('fs')
const async_hooks = require('async_hooks');
const { fd } = process.stdout;

let indent = 0;
async_hooks.createHook({
  init(asyncId, type, triggerAsyncId) {
    const eid = async_hooks.executionAsyncId();
    const indentStr = ' '.repeat(indent);
    fs.writeSync(
      fd,
      `${indentStr}${type}(${asyncId}):` +
      ` trigger: ${triggerAsyncId} execution: ${eid} \n`);
  },
  before(asyncId) {
    const indentStr = ' '.repeat(indent);
    fs.writeSync(fd, `${indentStr}before:  ${asyncId}\n`);
    indent += 2;
  },
  after(asyncId) {
    indent -= 2;
    const indentStr = ' '.repeat(indent);
    fs.writeSync(fd, `${indentStr}after:  ${asyncId}\n`);
  },
  destroy(asyncId) {
    const indentStr = ' '.repeat(indent);
    fs.writeSync(fd, `${indentStr}destroy:  ${asyncId}\n`);
  },
}).enable();

function callback(err, data) {
    console.log('callback', data)
}

fs.readFile("a.txt", callback)
console.log('after a')
fs.readFile("b.txt", callback)
console.log('after b')

3.Buffer

对于JavaScript 语言,其自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,依赖二进制数据。因而 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

Node.js中的Buffer是一个全局对象,属于固有(built-in)类型的全局变量,不需要使用require函数导入。它允许直接操作原始内存,主要用于处理二进制数据流。Buffer实例对象的结构和整数数组很像,但Buffer的大小是固定的且在V8堆外分配物理内存。

每个Buffer实例对应底层的固定长度的内存分配,大小在被创建时确定,且无法改变,但实例对象的内容可以像操作数组一样修改。此外,Buffer实例的元素为16进制的两位数,即0~255的数值(16的二次方),可以像数组一样操作Buffer实例。

Buffer将性能相关的部分使用C++实现,非性能相关的部分使用JavaScript实现。使用Buffer的主要原因是基于性能方面的考虑,特别是在进行I/O操作和网络数据传输时,预先把静态内容(字符串、图片等)转换为Buffer对象,可以减少CPU的重复使用、节省服务器资源并大幅提升性能。

使用:

const buf = Buffer.from('Hello, world!', 'utf8');
console.log(buf.toString('base64'));

需要注意的是,由于Buffer实例是在V8堆外分配内存,因此在使用完Buffer实例后应该手动将其释放,避免内存泄漏。可以通过调用Buffer.alloc()Buffer.from()方法来创建一个新的Buffer实例来释放内存。

释放内存:

let buffer = Buffer.alloc(10); // 创建一个大小为10的buffer对象
// 使用buffer对象进行数据处理
buffer = null; // 释放内存

好了,今天到这里,大数据推给你自会有它的道理,希望你能懂,带着信念走下去!🤔 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weifont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值