为什么我的 exec 命令失败,但如果在终端中传递该命令则有效?

Dᴀʀ*_*ᴅᴇʀ 3 macos node.js package.json gitleaks

由于某种原因,我不明白为什么我的命令出现问题exec,我相信我遵循了我正确引用的文档和示例。当我在终端中运行此命令时,我没有遇到问题:

gitleaks --repo=https://github.com/user/repo -v --username=foo --password=bar
Run Code Online (Sandbox Code Playgroud)

但是当我尝试将其编码为模块以便我可以在 package.json 中调用它时:

const { exec } = require("child_process")
const test = `gitleaks --repo=https://github.com/user/repo -v --username=foo --password=bar`

const execRun = (cmd) => {
  return new Promise((resolve, reject) => {
    exec(cmd, (error, stdout, stderr) => {
      if (error) reject(error)
      resolve(stdout ? stdout : stderr)
    })
  })
}

(async () => {
try {
  const testing = await execRun(test)
  console.log(testing)
} catch (e) {
  console.log(e)
}
})()
Run Code Online (Sandbox Code Playgroud)

但我仍然收到错误:

{ Error: Command failed: gitleaks --repo=https://github.com/user/repo -v --username=foo --password=bar

    at ChildProcess.exithandler (child_process.js:294:12)
    at ChildProcess.emit (events.js:198:13)
    at maybeClose (internal/child_process.js:982:16)
    at Socket.stream.socket.on (internal/child_process.js:389:11)
    at Socket.emit (events.js:198:13)
    at Pipe._handle.close (net.js:606:12)
  killed: false,
  code: 1,
  signal: null,
  cmd:
   'gitleaks --repo=https://github.com/user/repo -v --username=foo --password=bar' }
Run Code Online (Sandbox Code Playgroud)

我尝试研究我的问题,看看我是否遗漏了某些内容并阅读:

为什么我的exec命令失败,但我可以在终端中传递相同的命令并且它有效?

Ric*_*ieg 7

当该exec函数运行命令时,它会检查该命令的退出代码。它假定 0 以外的退出代码是错误,因此在回调中传递错误。如果gitleaks在存储库中发现机密,则它会以代码 1 退出。

沿着这些思路的东西应该有效:

const { exec } = require("child_process")
const test = `gitleaks --repo=https://github.com/user/repo -v --username=foo --password=bar`

const execRun = (cmd) => {
  return new Promise((resolve, reject) => {
    exec(cmd, (error, stdout, stderr) => {
      if (error) {
        if (error.code === 1) {
          // leaks present
          resolve(stdout);
        } else {
          // gitleaks error
          reject(error);
        }
      } else {
        // no leaks
        resolve(stdout);
      }
    })
  })
}

(async () => {
try {
  const testing = await execRun(test)
  console.log(testing)
} catch (e) {
  console.log(e)
}
})()
Run Code Online (Sandbox Code Playgroud)