Ошибка выполнения команды nodejs без полезного сообщения об ошибке

Это код для выполнения



    cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) {
        if (e) {
            var errorstr = "Compilation failed with the following error
"+ e.message.toString() client.send(errorstr) console.log(e, stdout, stderr) ee.prototype.removeAllListeners() } else if (stderr.length > 0) { client.send("Compilion finished with warnings\n"+ stderr + '\n') client.send('compiled') ee.prototype.emit('compiled') } else { client.send("Compilation successful") ee.prototype.emit('compiled') } })

'client' - это аргумент аргумента обратного вызова socket.io. 'ee' является экземпляром EventEmitter

Приходя к проблеме. При запуске кода обратный вызов сообщает, что команда не выполнена. console.log(e, stdout, stderr) - это

 { [Ошибка: команда не выполнена: ] kill: false, код: false, сигнал: undefined} '' '' 

/tmp/test.c является допустимым кодом C, и при проверке каталога / tmp я нахожу, что test.c является правильным, а двоичный "test" генерируется и при запуске в оболочке выполняется правильно. Так что я не понимаю, почему это отмечает неудачное выполнение. Информация об объекте ошибки также бесполезна. Был бы признателен за помощь / объяснение

1 ответ

Решение

Я немного обеспокоен выводом в консоль.

{ [Error: Command failed: ] killed: false, code: false, signal: undefined }

не выглядит как правильный объект JSON/JavaScript, особенно [Error: Command failed: ] часть; пропущена хотя бы запятая

Предложения:

  1. Запустите команду из командной строки и проверьте код выхода (используйте echo $?). Если код выхода равен!= 0, то это означает, что команда "не выполнена" (что бы это ни значило).

  2. Когда команда терпит неудачу, nodejs говорит, что поместит код выхода в e.code (что мне не хватает в вашем выводе...). Узнайте, что случилось с этим значением.

  3. Пытаться if(e !== null) вместо if(e), Не должно иметь значения, все же.

  4. Вместо непосредственного вызова компилятора вызовите скрипт оболочки, который перенаправляет stderr / stdout в файл (или сохраните копию, используя cc ... |& tee /tmp/cc.log) чтобы убедиться, что никакая часть сложной установки не проглотит важную информацию.

Другие вопросы по тегам