nodejs

child_process

使用nodejs的过程中,child_process应该是比较常用的,可用于调用系统上的命令,但实际使用时可能会遇到不少的坑,尤其在windows下使用时。

一、spawn

语法参见:Child process | Node.js v16.14.2 Documentation

1、调用系统命令dir

const child_process = require('child_process');
const spawnRes = child_process.spawnSync('dir',[],{encoding: 'utf-8'});
console.log(`spawnRes:${JSON.stringify(spawnRes)}`)

此时报错如下:

spawnRes:{"error":{"errno":-4058,"code":"ENOENT","syscall":"spawnSync dir","path":"dir","spawnargs":[]},"status":null,"signal":null,"output":null,"pid":0,"stdout":null,"stderr":null}

为解决以上异常,需要添加配置:shell:true

但是在linux、mac下无需设置也可运行,但如果shell设置为true,也可以正常使用,但会额外打开一个shell进程,将会影响性能,因此为兼容各个操作系统,将配置修改为:shell: process.platform === 'win32',即:

const spawnRes = child_process.spawnSync('dir',{encoding: 'utf-8',shell: process.platform === 'win32'});

二、fs

1、乱码处理

记事本默认编码方式为ANSI,通过fs直接读取文件内容时,可能会出现乱码,可以通过iconv、iconv-lite(此性能可能会更好)转码进行解决。

const data = fs.readFileSync("C:\\test.txt",{encoding:'utf8'}).toString(); 
console.log(`data: ${data}`); //输出为乱码:���±�Ĭ�ϱ�����ԡ�

为保证能正常读取文件内容,需要先以二进制的方式读取文件,并将读取的内容以GBK编码方式解码:

const data = fs.readFileSync("C:\\test.txt",{encoding:'binary'});
console.log(`data:${data}`); // 此输出仍为乱码:¼Çʱ¾Ä¬ÈϱàÂë²âÊÔ¡£
// 转换为buffer
var buf = Buffer.from(data,'binary');  
// 以GBK进行解码
var str = iconv.decode(buf,'GBK');  
console.log(`str: ${str}`); // 此输出为:记事本默认编码测试。

如果文件以utf8方式编码且无BOM编码的,则读取时以utf8编码方式直接读取,不需要iconv解码。

未完待续

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...