我正在通过书籍Node.js the Right Way学习Node.js。我正在尝试运行以下示例来监视对名为target.txt
的文件的更改,该文件与.js
文件位于同一目录中。
"use strict";
const
fs = require('fs'),
spawn = require('child_process').spawn,
filename = process.argv[2];
if (!filename) {
throw Error("A file to watch must be specified!");
}
fs.watch(filename, function () {
let ls = spawn('ls', ['-lh', filename]);
ls.stdout.pipe(process.stdout);
});
console.log("Now watching " + filename + " for changes...");
更改文本文件并保存时出现以下错误:
events.js:160 扔掉//未处理的'错误'事件 ^
错误:产生ls ENOENT at exports._errnoException(util.js:1018:11) 在Process.ChildProcess._handle.onexit(internal / child_process.js:193:32) at onErrorNT(internal / child_process.js:367:16) at _combinedTickCallback(internal / process / next_tick.js:80:11) at process._tickCallback(internal / process / next_tick.js:104:9)
Node.js版本:v6.11.0
IDE :Visual Studio Code 1.13.1
操作系统:Windows 10 64x
答案 0 :(得分:3)
Windows上没有ls
,您应该使用dir
。
但是,这不是可执行文件。要运行.bat
和.cmd
个文件,您可以:
Spawn cmd.exe
并将这些文件作为参数传递:
require('child_process').spawn('cmd', ['/c', 'dir']);
spawn
选项设置为shell
时使用true
:
require('child_process').spawn('dir', [], { shell: true });
使用exec
代替spawn
:
require('child_process').exec('dir', (err, stdout, stderr) => { ... });
有关详情,请查看this section in the official docs。
修改强>
我不确定我是否在评论中正确理解了您的问题,但是如果您选择第二个选项,例如,您的代码将如下所示:
...
fs.watch(filename, function () {
let dir = spawn('dir', [filename], { shell: true });
dir.stdout.pipe(process.stdout);
});
...
请注意,您可能需要稍微调整此代码。我正在从内存中写这些内容,因为我现在无法访问Windows机器,因此我无法自行测试。