全局变量 global 、globalThis、nodejs内置全局API

 

在nodejs 环境中  index.js 引用  a.js  ,在index.js 设置全局变量 global.xxx = 'xxx'  ,被引用的a.js 也读取全局变量xxx

但是在浏览器环境下,全局变量在 window。不同的环境需要判断,所以CMAScript 2020 出现了一个globalThis全局变量,在nodejs环境会自动切换成global 。

  

nodejs内置全局API

__dirname: 它表示当前模块的所在目录绝对路径

/Users/zhuangxiaodong/code/node_test/my-package

 __filename :  它表示当前模块文件的绝对路径,包括文件名和文件扩展名

/Users/zhuangxiaodong/code/node_test/my-package/test.js

  注意:__dirname 和 __filename 只能在cjs使用 ,而esm规范没有这两个全局变量!

 

 process

  1. process.argv  返回包含命令行参数数组  第一个元素是Node.js的执行路径,第二个元素是当前执行的JavaScript文件的路径,之后的元素是传递给脚本的命令行参数。
  2. process.env : 这是一个包含当前环境变量的对象。您可以通过process.env访问并操作环境变量 。但是不能改变全局的环境变量,仅在当前语言环境中使用
  3. process.cwd(): 这个方法返回当前工作目录的路径。    (类似 :__dirname
  4. process.on(event, listener): 用于注册事件监听器。您可以使用process.on监听诸如exituncaughtException等事件,并在事件发生时执行相应的回调函数(listener)。
  5. process.exit([code]): 用于退出当前的Node.js进程。您可以提供一个可选的退出码作为参数
  6. 常用的退出码
    退出码含义典型使用场景
    0 成功退出 程序正常执行完毕
    1 未捕获的异常或通用错误 发生未处理的错误(如 throw
    2 系统或配置错误 错误的命令行参数(如 --help
    3 内部 JavaScript 错误 代码解析失败(如语法错误)
    4 内部执行失败 异步任务未完成(如 Promise 未处理)
    5 致命错误(V8 引擎相关) 内存溢出等严重问题
    执行后立即退出程序 不会等待异步操作,所以慎用,可以使用 process.exitCode = code。
    • 在终端运行 Node.js 脚本后,可通过 echo $?(Linux/macOS)或 echo %ERRORLEVEL%(Windows)查看上一个命令的退出码。

  7. process.pid: 这个属性返回当前进程的PID(进程ID)

   记录日志

console.log(`[PID:${process.pid}] 服务器已启动`);

  终止当前进程

console.log("当前进程 PID:", process.pid);
process.kill(process.pid, "SIGTERM"); // 发送终止信号



接收终止信号--优雅关闭

// 监听 SIGTERM(kill 默认发送的信号)
process.on("SIGTERM", () => {
  console.log("收到 SIGTERM 信号,准备优雅关闭...");
  server.close(() => {
    console.log("HTTP 服务器已关闭");
    process.exit(0); // 0 表示成功退出
  });
});

 

终止进程

Linux / macOS

kill -9 <PID>  # 强制终止

Windows

taskkill /PID <PID> /F
 

这些只是process对象的一些常用属性和方法,还有其他许多属性和方法可用于监控进程、设置信号处理、发送IPC消息等。

需要注意的是,process对象是一个全局对象,可以在任何模块中直接访问,无需导入或定义。

 

Buffer 

在 Node.js 中,Buffer 类用于创建一个专门存放二进制数据的缓存区。由于 JavaScript 语言自身只有字符串数据类型,没有二进制数据类型,因此在处理像 TCP 流或文件流时,必须使用到二进制数据。Buffer 类是随 Node 内核一起发布的核心库,可以让 Node.js 处理二进制数据。

 

1、创建 Buffer 实例:

  • Buffer.alloc(size[, fill[, encoding]]):
    • 创建一个指定大小的新的Buffer实例,初始内容为零。
      • size(必填):要分配的缓冲区大小(字节数)。
      • fill参数可用于填充缓冲区,
      • encoding参数指定填充的字符串,编码默认 "utf8"
//创建一个长度为4096字节(0x1000十六进制)的缓冲区,并用十六进制数0x00填充它 
console.log(Buffer.alloc( 0x1000, 0x00, 'hex' ))

const buf1 = Buffer.alloc(10);
console.log(buf1); // <Buffer 00 00 00 00 00 00 00 00 00 00>

 

// 填充数字 255
const buf2 = Buffer.alloc(5, 255);
console.log(buf2); // <Buffer ff ff ff ff ff>

// 填充字符串 "a"
const buf3 = Buffer.alloc(5, "a");
console.log(buf3); // <Buffer 61 61 61 61 61>('a' 的 ASCII 码是 0x61)

// 填充字符串 "你好"(UTF-8 编码)
const buf4 = Buffer.alloc(10, "你好", "utf8");
console.log(buf4); // <Buffer e4 bd a0 e5 a5 bd e4 bd a0 e5>

  

Buffer.from(input[, encoding])     

   是 Node.js 中用于从不同类型的数据创建 Buffer 实例的方法

  1. input:用于创建 Buffer 的数据,可以是:

    • 一个 字符串(将被编码为 Buffer)。
    • 一个 数组 或 类数组对象
    • 一个 ArrayBuffer
    • 一个 现有的 Buffer(将被克隆)
  1. encoding(可选):指定编码方式,用于将字符串转换为 Buffer。常见的编码方式包括:

    • 'utf8'(默认)
    • 'ascii'
    • 'base64'
    • 'hex'
const buf1 = Buffer.from('你好,世界!', 'utf8'); //从字符串创建
const buf2 = Buffer.from([1, 2, 3, 4]);//从数组创建:
const buf3 = Buffer.from(buf2); //从现有 Buffer 创建(克隆):

const ab = new ArrayBuffer(10); //从 ArrayBuffer 创建
const buf4 = Buffer.from(ab);  

 

2、读取和写入数据:

  • buffer[index]: 通过索引读取或写入Buffer实例中的特定字节。
  • buffer.length: 获取Buffer实例的字节长度。
const buf2 = Buffer.from([1, 2, 3, 4,"???","aazxd"])
console.log(buf2[0]) // 1
console.log(buf2.length) // 7
  • buffer.toString([encoding[, start[, end]]]): 将Buffer实例转换为字符串。
const buffer = Buffer.from('Hello, World!', 'utf8');

console.log(buffer.toString('utf8'))//Hello, World!
console.log(buffer.toString('utf8', 0, 5)) //Hello

const buffer2 = Buffer.from('68656c6c6f', 'hex');  // '68656c6c6f' 是 'hello' 的十六进制表示
console.log(buffer2.toString('utf8'));  //hello 
  • buffer.toJSON()  :  用于将 Buffer 对象转换为 JSON 格式 返回的 JSON 对象包含一个 type 属性和一个 data 属性。

{
  type: 'Buffer',
  data: <Buffer的数据数组>
}

 

将 Buffer 转换为 JSON:
const buffer = Buffer.from('Hello, World!');
const json = buffer.toJSON();
console.log(json);
// 输出: { type: 'Buffer', data: [ 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33 ] }
  • buffer.slice([start[, end]]): 返回一个新的Buffer实例,其中包含原始Buffer实例的部分内容。

其他:

  • Buffer.isBuffer(obj): 检查一个对象是否是Buffer实例。
  • Buffer.concat(list[, totalLength]): 将一组Buffer实例或字节数组连接起来形成一个新的Buffer实例。
posted @ 2025-03-12 14:01  蜗牛般庄  阅读(166)  评论(0)    收藏  举报
Title
页脚 HTML 代码