错误:在Windows上生成ENOENT

时间:2016-05-26 11:35:03

标签: node.js

我在节点v4.4.0和Windows 10上。我正在使用bunyan来记录我的节点应用程序。

var transaction = db.transaction("employee");
var objectStore = transaction.objectStore("employee");

由于我使用try { var fs = require('fs'); var path = require('path'); var spawn = require('child_process').spawn; var through = require('through'); } catch (err) { throw err; } var prettyStream = function () { // get the binary directory of bunyan var bin = path.resolve(path.dirname(require.resolve('bunyan')), '..', 'bin', 'bunyan'); console.log(bin); // this outputs C:\www\nodeapp\src\node_modules\bunyan\bin\bunyan, the file does exist var stream = through(function write(data) { this.queue(data); }, function end() { this.queue(null); }); // check if bin var is not empty and that the directory exists if (bin && fs.existsSync(bin)) { var formatter = spawn(bin, ['-o', 'short'], { stdio: [null, process.stdout, process.stderr] }); // stream.pipe(formatter.stdin); // <- did this to debug } stream.pipe(process.stdout); // <- did this to debug return stream; } 的事实,日志记录在控制台中吐出,我这样做是为了调试函数的其余部分。

然而我收到错误:

stream.pipe(process.stdout);

我猜这是Windows错误。有人有什么想法吗?

5 个答案:

答案 0 :(得分:14)

我明白了。在Windows上,bunyan在控制台中不能作为程序识别,而是作为命令识别。因此,要调用它,需要使用cmd。我还必须在全局安装bunyan,以便控制台可以访问它。

if (!/^win/.test(process.platform)) { // linux
    var sp = spawn('bunyan', ['-o', 'short'], {
        stdio: [null, process.stdout, process.stderr]
    });
} else { // windows
    var sp = spawn('cmd', ['/s', '/c', 'bunyan', '-o', 'short'], {
        stdio: [null, process.stdout, process.stderr]
    });
}

答案 1 :(得分:3)

在生成选项中使用{shell:true}

我最近遇到这个问题,因此决定在这里添加我的发现。我终于在Node.js documentation中找到了最简单的解决方案。它解释说:

  • child_process.exec()与shell一起运行
  • child_process.execFile()在没有外壳的情况下运行
  • child_process.spawn()在没有外壳的情况下运行(默认情况下)

这实际上就是execspawn行为不同的原因。因此,要获得spawn中所有可用的shell命令和任何可执行文件(就像在常规shell中一样),只需运行即可:

const { spawn } = require('child_process')
const myChildProc = spawn('my-command', ['my', 'args'], {shell: true})

或者为您可以使用的不同操作系统提供通用说明

const myChildProc = spawn('my-command', ['my', 'args'], {shell: process.platform == 'win32'})

旁注:

  1. 即使一个人出于基本目的而使用非Windows系统以实现完全互操作性,使用这样的通用语句也是很有意义的
  2. 要使Node.js child_process命令完全一致,将spawn(带外壳)和spawnFile(不带外壳)反映出exec和{{1}会很有帮助。 },并避免这种混淆。

答案 2 :(得分:1)

我使用cross-spawn解决了同样的问题。它允许我在windows和mac os上生成命令作为一个常用命令。

答案 3 :(得分:0)

我想您会发现它根本找不到“bunyun”,但是如果您附加了“.exe”,它就会起作用。在不使用 shell 的情况下,它会寻找精确的文件名匹配来运行文件本身。

当您使用 shell 选项时,它会通过匹配的可执行扩展并以这种方式找到匹配项。因此,您可以通过附加二进制文件的可执行扩展来节省一些开销。

答案 4 :(得分:-1)

我认为,bin或某事的路径可能是错误的。 ENOENT = [E] rror [NO] [ENT] ry