如何使用Naked在Python中正确捕获Node js脚本的错误?

时间:2019-12-05 13:46:29

标签: python node.js django amp-html

我正在使用提到的here的Python裸体库来执行Nodejs脚本,该脚本也here也可用。关键是,每当我通过终端运行我的python脚本(完全来自以上链接)时,我都可以看到nodejs脚本的输出。我将此Python脚本包含在Django服务器中,并在进行API调用时运行它。

页面验证失败时,我无法正确捕获错误。它总是返回“成功”。我觉得这是因为Nodejs是异步的。如果是这样,我该如何使npm网站中提到的函数'amphtmlValidator.getInstance()。then(function(validator)')进行同步?我对Node.js真的很陌生。

实际上,我只需要从Django中的python脚本验证AMP页面,我发现的唯一方法是通过python调用node脚本。一切正常,但是我无法正确捕获错误。 请帮忙。

1 个答案:

答案 0 :(得分:0)

我通过将“ getInstance()”代码写入异步函数来解决此问题,然后添加了2秒的睡眠时间,以确保将所有数据写入控制台。如果节点脚本中出现任何错误,我将手动添加关键字“ ERROR”,否则我将添加“ PASS”。

每当我使用Python执行此脚本时,我都会检查关键字。我知道这个答案不好,但是我可以管理正常的工作。 这是我所做的:

节点脚本:

    function sleep(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms)
  })
}

// async function that accepts a html file content and validates
async function validation(file) {
  //console.log(file);
  amphtmlValidator.getInstance().then(
    function(validator) {
      var result = validator.validateString(file);
      if (result.status === 'PASS') {
        console.log("PASS")
      } else {
        for (var ii = 0; ii < result.errors.length; ii++) {
          var error = result.errors[ii];
          var msg = 'ERROR : ' + 'line ' + error.line + ', col ' + error.col + ': ' + error.message;
          console.log(msg);
        }
      }
    });
  await sleep(2000);
}

Python:

response = muterun_js("validate.js", args)

if response:
  if "ERROR" in response.stdout.decode():
      print("validation failed")
  elif "PASS" in response.stdout.decode():
      print("success")