Nodejs执行命令失败,没有有用的错误信息

nodejs exec command failing with no useful error message

本文关键字:有用 错误 信息 执行 命令 失败 Nodejs      更新时间:2023-09-26

这是执行

的代码

    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)是

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

/tmp/test. C是一个有效的C代码,在检查目录/tmp时,我发现test. C是正确的,二进制'test' 正在生成,并在shell中运行,正确执行。所以我不明白为什么它会标记执行失败。错误对象的信息也没有帮助。

我有点担心控制台的输出。

{ [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. 不要直接调用编译器,而是调用shell脚本将stderr/stdout重定向到一个文件(或使用cc ... |& tee /tmp/cc.log保存副本),以确保复杂设置的任何部分都不会吞噬重要信息。