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

相关推荐
2603_9658966242 分钟前
async/await|JS同步写法解决异步终极方案
前端·javascript
高级程序源15 小时前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
lizz227616 小时前
Babel插件手册
javascript
VXbishe19 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
志尊宝19 小时前
Vue3 零基础每日笔记(037):动手封装 useMouse 与 useWindowSize——事件监听的标准模板
前端·javascript·vue.js·笔记·html5
shmily麻瓜小菜鸡19 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
wcy031021 小时前
POST为什么会发送两次请求
javascript·ajax
志尊宝21 小时前
Vue3 零基础每日笔记(047):动态路由与路由参数——:id 传参、query 传参、props 解耦
前端·javascript·vue.js·笔记·html5
半生过往21 小时前
Node.js 多版本管理完全指南
node.js
朝屯暮蒙vi1 天前
随记:h5+中uploader不能添加参数数据,要通过task
javascript