Почему моя команда exe c не работает, но работает, если команда передается в терминале? - PullRequest
1 голос
/ 15 апреля 2020

По какой-то причине я не понимаю, почему у меня возникла проблема в моей команде exec, и я считаю, что следовал документации и примерам, на которые я ссылался правильно. Когда я запускаю эту команду в терминале, у меня нет проблемы:

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

, но когда я пытаюсь закодировать ее как модуль, чтобы я мог вызвать ее в пакете. 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)
}
})()

но я продолжаю получать сообщение об ошибке:

{ 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' }

Я пытался исследовать свою проблему, чтобы увидеть, что я что-то упустил, и прочитать:

Почему моя команда exec не выполняется, но я могу передать ту же команду в терминале, и она работает?

1 Ответ

0 голосов
/ 15 апреля 2020

Когда функция 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)
}
})()
...