【悄咪咪学Node.js】7.5 os.platform() 篡改 platform 标识与防止

os.platform()

1. 前言

本系列课程对非功能性函数内容安排中,将插入一些在生产过程中可能会用到对应函数的例子。

本节课将会引导大家学习了解:

  • os.platform()process.platform 的使用方法
  • os.platform()process.platform 在生产中的作用

学习完本节课程后,应该具有:

  • 使用 os 模块获取当前系统平台标识,并通过判断,实现不同需求的能力

2. os.platform()

os.platform() 可以获取标识操作系统平台的字符串。 该值在编译时设置。 可能的值有 'aix'、 'darwin'、 'freebsd'、 'linux'、 'openbsd'、 'sunos' 和 'win32'。

复制代码
以下提供一个对应表格。

2.1 对应表格

标识 系统
aix AIX 系统
darwin 苹果 macos
freebsd FreeBSD 系统
linux linux 系统
openbsd openbsd 系统
sunos Solaris 系统或 sunos 内核
win32 Windows 系统(64位系统的标识也是 win32)

2.2 代码例子

我们先来执行下面这段代码:

js 复制代码
// 引入 os 模块
const os = require('os');

// 打印结果
console.log(os.platform());

windows 结果:

shell 复制代码
win32

macos 结果:

shell 复制代码
darwin

Tips:Node.js 有一些原生 API 和 第三方库 API 在不同系统中有不同的表现形式,现在用 os.platform() 区分即可。

2.3 process.platform

Node.js 在运行时,会将系统平台信息写入到 process.platform 参数中。

我们可以用以下语句获取:

js 复制代码
console.log(process.platform);

windows 结果:

shell 复制代码
win32

macos 结果:

shell 复制代码
darwin

2.4 可信度

在这不禁怀疑该值的可信度,试一下修改:(macos 系统为例)

js 复制代码
process.platform = "noneJS_OS";

console.log(process.platform);

结果:

shell 复制代码
darwin

Tips:对 process.platform 修改不会生效,process.platform 值可信。

既然如此,我们试着修改一下 os.platform():(macos 系统为例)

js 复制代码
const os = require('os');

os.platform = function() {
    return "noneJS_OS"
};

console.log(os.platform());

结果:

shell 复制代码
noneJS_OS

Tips:通过重写 os.platform() 函数,能修改这个函数的返回值,使得获取的系统平台 不可信

通过上面的结果可知,在实际情况下,使用 process.platform 更好。

process 参数能被覆盖,所以养成良好的命名习惯,避免使用 Node.js 自身变量名、避免重写 API 十分重要。

3. 生产中的作用

  1. 用法一

    区分不同系统以适配功能,如前文提到的 os.freemem()macos 上表现 异常,现在我们能区分出数据是否可信了:

    js 复制代码
    const os = require('os');
    
    if (os.platform() === 'darwin') {
        console.log('您在使用 macos 系统,空闲内存暂不能估计。');
    } else {
        console.log('空闲内存:', os.freemem());
    }

Tips:可以使用 process.platform 代替 os.platform()

4. 小结

本节课程我们主要学习了 os.platform()、process.platform 及其在生产上的用法

重点如下:

  1. 重点1

    使用 os.platform()process.platform 可以针对不同的系统平台实现不同的需求。

  2. 重点2

    养成良好的命名习惯,避免重写 API,或覆盖参数。

相关推荐
mCell5 小时前
GSAP ScrollTrigger 详解
前端·javascript·动效
gnip5 小时前
Node.js 子进程:child_process
前端·javascript
codingandsleeping11 小时前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
白水清风12 小时前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
用户221520442780012 小时前
new、原型和原型链浅析
前端·javascript
阿星做前端12 小时前
coze源码解读: space develop 页面
前端·javascript
叫我小窝吧12 小时前
Promise 的使用
前端·javascript
前端康师傅13 小时前
JavaScript 作用域
前端·javascript
云枫晖13 小时前
JS核心知识-事件循环
前端·javascript
eason_fan14 小时前
Git 大小写敏感性问题:一次组件重命名引发的CI构建失败
前端·javascript