微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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解码。

未完待续

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐