Bootstrap

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

我说假如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; // 释放内存

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

;