2016-05-26 2 views
1

Я нахожусь в узле v4.4.0 и в Windows 10. Я использую bunyan для регистрации моего приложения-узла.Ошибка: вызвать ENOENT на Windows

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);, я сделал это для отладки остальной части функции.

Я же получаю ошибку:

Error: spawn C:\www\nodeapp\src\node_modules\bunyan\bin\bunyan ENOENT 
    at exports._errnoException (util.js:870:11) 
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32) 
    at onErrorNT (internal/child_process.js:344:16) 
    at nextTickCallbackWith2Args (node.js:442:9) 
    at process._tickCallback (node.js:356:17) 
    at Function.Module.runMain (module.js:443:11) 
    at startup (node.js:139:18) 
    at node.js:968:3 

Я предполагаю, что это ошибка Windows. У кого-нибудь есть идеи?

ответ

8

У меня есть. В 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

Я думаю, путь bin или что-то не так. ENOENT = [E] rror [NO] [ENT] ry

+0

Любые идеи? Файл bunyan существует:/ –

1

Я решил такую ​​же проблему используя cross-spawn. Это позволяет мне запускать команду на обоих окнах и mac os как одну общую команду.

+0

НАКОНЕЦ! это сработало для меня :) Большое вам спасибо! –