npm test不会捕获异步函数中抛出的错误

时间:2017-02-09 12:05:44

标签: javascript node.js npm async-await babeljs

我目前正在为我的项目编写一些测试脚本。代码使用ES7编写,并使用babel

进行编译

首先是一些背景:

假设您运行npm test,测试文件如下所示:

function foo (bar) {
  if (!bar) throw new Error('foooo')
  console.log(bar)
}
foo() // No argument given

现在,当您运行此脚本时,npm将显示如下错误:

$ npm ERR! Test failed.  See above for more details.

这是所需的输出,出了点问题,你不想发布这个软件,因为那里有错误。

那么我的问题是什么?

Okey所以我有一个像这样的测试脚本设置:

async function init () {
  const status = await someRequestPromise()
  if (status.error) throw status.error
  console.log(status.result) // Log the result of this async request...
}
init()

首先运行我的测试我使用babel编译ES7:

$ babel src -d dist

然后运行npm test

结果

CLI screenshot 要明确的是,npm没有触发错误...

我也尝试了以下代码,但这并没有改变任何东西......

async function init () {
  const status = await someRequestPromise()
  if (status.error) throw status.error
  console.log(status.result) // Log the result of this async request...
} 

try {
  init()
} catch (e) {
  console.log(e)
}

我想知道如何触发npm来捕获错误并报告测试失败的事实。此外,我想知道如何捕获错误,因为节点现在将它们标记为未处理,即使使用try catch块也是如此。

PS。在await函数前添加init()语句会导致语法错误,请不要建议。

2 个答案:

答案 0 :(得分:0)

因为async/await返回promises,你必须通过.catch处理拒绝(就像控制台输出所示):

const handle = init()
handle
  .then((result) => handleSuccess(result))
  .catch(({message}) => console.log(message))

try/catch(至少,根据我的经验)是同步代码。

编辑:

要使脚本“崩溃”,您只需添加process.exit(1)即可。

const handle = init()
handle
  .then((result) => handleSuccess(result))
  .catch(({message}) => {
     console.log(message)
     process.exit(1)
   })

答案 1 :(得分:0)

晚了很多年,但我相信这样做的一种正确方法(没有顶级等待)是将 try catch 移动到 'init' 函数中

<input type=hidden name=target value="$$target$$">
Injection Code

Injection
<input type=hidden name=target value="https://test/ff5b27051cb9fatest" accesskey=x onclick=alert(document.location)"">

评论可能不是 100% 准确,但它试图传达想法。

基本上,try catch 可用于解析或拒绝 promise,但前提是在 try/catch 中的某处等待 promise 时