NodeJS 从shell命令读取ChildProcess返回值

67up9zun  于 12个月前  发布在  Node.js
关注(0)|答案(1)|浏览(151)

我正在Nextjs API路由中执行此ChildProcess函数,但无法从中读取值。

const output = exec(
    "curl -s -v https://test.com/index.php",
    (err, stdout, stderr) => {
      if (err) {
        console.error(err);
        process.exit(1);
      } else {
        var lines = stderr.split("\n");
        var numLines = lines.length;
        var i;
        let regex = /Set\-Cookie:\ SESSIDe08a=[0-9A-Za-z]*;\ /i;

        for (i = 0; i < numLines; i++) {
          var line = lines[i];
          if (regex.test(line)) {
            let n = line.replace(/^.*SESSIDe08a=([^;]+);[.]+$/, "$1");
            let l = n.replace(/^.*SESSIDe08a=/, "");
            let a = l.split(" ");
            let final = a[0].replace(";", "");

            return final; // <=== I need this value
          }
        }

      }
    }
  );

字符串
如何读取返回的final值?

yzuktlbb

yzuktlbb1#

由于你有一个回调函数,当你返回时,你返回的是回调函数,它不是向上传递的,而是从exec()返回的。你需要使用一个超出作用域的变量。然而,这样做的问题是执行会继续。你需要使用一个promise。参考this thread,然后:

let output;
try {
  const { stdout, stderr } = await exec("curl -s -v https://test.com/index.php");
  var lines = stderr.split("\n");
  var numLines = lines.length;
  var i;
  let regex = /Set\-Cookie:\ SESSIDe08a=[0-9A-Za-z]*;\ /i;

  for (i = 0; i < numLines; i++) {
    var line = lines[i];
    if (regex.test(line)) {
      let n = line.replace(/^.*SESSIDe08a=([^;]+);[.]+$/, "$1");
      let l = n.replace(/^.*SESSIDe08a=/, "");
      let a = l.split(" ");
      let final = a[0].replace(";", "");

      output = final;
      break; // You still need to end the loop
    }
  }
} catch (e) {
  console.error(err);
  process.exit(1);
}

字符串
如果你有一个最新版本的Node,你应该能够在顶层使用await,否则你需要将它 Package 在一个async函数中。

相关问题