使用util.promify和exec不能在git钩子中解析出承诺。

问题描述 投票:0回答:1

根据 文件 你可以承诺NodeJS的 require('child_process').exec 的方法来获取当前的分支名。

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function lsExample() {
  const { stdout, stderr } = await exec('ls');
  console.log('stdout:', stdout);
  console.error('stderr:', stderr);
}
lsExample();

然而当我在 "prepare-commit-msg "的git钩子中使用这种方法来获取当前分支的名称时。stdout 常量是一个承诺对象,而不是我期望的分支名称值。我错过了什么吗?

const util = require('util');
const stdExec = require('child_process').exec;
const exec = util.promisify(stdExec);

async function getBranchName() {
  const { err, stdout, stderr } = await exec('git rev-parse --abbrev-ref HEAD');

  console.log(err, stdout, stderr); // Returns correct stdout

  if (err) {
    // "git branch" will fail if initial commit hasn't been done, in that case, skip this hook
    process.exit(0);
  }

  return stdout;
}

function validateBranchName(name) {
    console.log(name);
)

// Call get branchName
if(condition) {
    const branchName = getBranchName(); // branchName is promise object

    validateBranchName(branchName);
}
node.js githooks node-promisify
1个回答
0
投票

我通过重构将函数被调用的地方固定为另一个async函数。

const util = require('util');
const stdExec = require('child_process').exec;
const exec = util.promisify(stdExec);

async function getBranchName() {
  const { err, stdout, stderr } = await exec('git rev-parse --abbrev-ref HEAD');

  console.log(err, stdout, stderr);

  if (err) {
    // "git branch" will fail if initial commit hasn't been done, in that case, skip this hook
    process.exit(0);
  }

  return stdout;
}

function validateBranchName(name) {
    console.log(name);
)

function async prepareCommitMsg() {
    const branchName = await getBranchName();

    validateBranchName(branchName);
}

// Call get branchName
if(condition) {
    prepareCommitMsg().then(() => {console.log('DONE!')});
}
© www.soinside.com 2019 - 2024. All rights reserved.