我说假如node.js 一路杀出,成为一种后端主要选型的时候,你再次去了解晚么,不晚,但给你的时间肯定不多~😄 跟着我一起开始认识node吧,今日份不多3个API ,加油
1.assert
在 Node.js 环境中开发时,质量不容忽视。为提高代码的健壮,我们经常需要断言工具来进行代码校验。Node.js 内建的断言库,即 assert 模块,充当了自动化测试和异常检测中的关键角色。断言是指一种预期表达式应始终为真的测试方法。如果遇到断言为假的情况,就会引发错误,这有助于开发者迅速识别问题所在。
引入:
const assert = require('assert');
断言函数:
- assert.ok(value, [message]): 要求 value 为真。如果为假,将抛出一个附有 message 的错误。
- assert.strictEqual(actual, expected, [message]): 验证 actual 和 expected 的值是否严格相等,不进行类型转换。
- assert.deepEqual(actual, expected, [message]): 验证 actual 和 expected 是否在值上相等,即使它们是不同类型的数据,也会尝试类型转换。
- assert.throws(block, [error], [message]): 验证 block 函数是否会引发错误,并可以指定期待错误类型的 error 。
- 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; // 释放内存
好了,今天到这里,大数据推给你自会有它的道理,希望你能懂,带着信念走下去!🤔