我在节点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错误。有人有什么想法吗?
答案 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中找到了最简单的解决方案。它解释说:
这实际上就是exec
和spawn
行为不同的原因。因此,要获得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'})
旁注:
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