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

相关推荐
一枚小小程序员哈1 小时前
基于Vue + Node能源采购系统的设计与实现/基于express的能源管理系统#node.js
vue.js·node.js·express
烛阴3 小时前
精简之道:TypeScript 参数属性 (Parameter Properties) 详解
前端·javascript·typescript
海上彼尚4 小时前
使用 npm-run-all2 简化你的 npm 脚本工作流
前端·npm·node.js
开发者小天4 小时前
为什么 /deep/ 现在不推荐使用?
前端·javascript·node.js
一枚小小程序员哈6 小时前
基于Vue的个人博客网站的设计与实现/基于node.js的博客系统的设计与实现#express框架、vscode
vue.js·node.js·express
找不到工作的菜鸟6 小时前
Three.js三大组件:场景(Scene)、相机(Camera)、渲染器(Renderer)
前端·javascript·html
定栓6 小时前
vue3入门-v-model、ref和reactive讲解
前端·javascript·vue.js
binqian7 小时前
【异步】js中异步的实现方式 async await /Promise / Generator
开发语言·前端·javascript
前端李二牛7 小时前
异步任务并发控制
前端·javascript
你也向往长安城吗7 小时前
推荐一个三维导航库:three-pathfinding-3d
javascript·算法