【悄咪咪学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,或覆盖参数。

相关推荐
YAY_tyy1 分钟前
Vue3 + Three.js 实战:自定义 3D 模型加载与交互全流程
前端·javascript·vue.js·threejs
英俊潇洒美少年1 小时前
SSE 流式接口讲解
javascript
我命由我123455 小时前
React Router 6 - 编程式路由导航、useInRouterContext、useNavigationType
前端·javascript·react.js·前端框架·html·ecmascript·js
橙露6 小时前
JavaScript 异步编程:Promise、async/await 从原理到实战
开发语言·javascript·ecmascript
我命由我123457 小时前
React Router 6 - 嵌套路由、路由传递参数
前端·javascript·react.js·前端框架·html·ecmascript·js
十六年开源服务商8 小时前
2026年WordPress网站地图完整指南
java·前端·javascript
英俊潇洒美少年8 小时前
MessageChannel 如何实现时间切片
javascript·react.js·ecmascript
技术钱10 小时前
react数据大屏四种适配方案
javascript·react.js·ecmascript
李明卫杭州10 小时前
JavaScript 严格模式下 arguments 的区别
前端·javascript
一次旅行10 小时前
今日心理学知识分享(三)
开发语言·javascript·程序人生·ecmascript