在绑定函数中吞下异步/等待错误

时间:2016-10-14 08:31:33

标签: javascript node.js express error-handling async-await

我正在运行使用async / await的Express应用程序。

我有两条看起来像这样的路线:

app.post('/add-item', item.bind(null, 'add'))
app.post('/remove-item', item.bind(null, 'remove'))

路由处理程序定义如下:

async function item (action, req, res, next) {
  if (action === 'add') {
    var result = await addItemFromDB()
    res.json(result)
  } else {
    var result = await removeItemFromDB()
    res.json(result)
  }
}

因为我想避免在addItemFromDB中包装removeItemFromDBtry/catch函数,所以我将它包装在辅助函数asyncRequest中:

asyncRequest(async function item(req, res, next) {
  if (action === 'add') {
    var result = await addItemFromDB()
    res.json(result)
  } else {
    var result = await removeItemFromDB()
    res.json(result)
  }
})

asyncRequest定义为:

function asyncRequest (handler) {
  return function (req, res, next) {
    return handler(req, res, next).catch(next)
  }
}

但是,addItemFromDBremoveItemFromDB中出现的所有错误都会被默默地吞没。我发现的是,当我删除.bind(null, 'add')等时,一切都按预期工作。

为什么会出现这种情况?

1 个答案:

答案 0 :(得分:1)

你必须使用

app.post('/add-item', asyncRequest(item.bind(null, 'add')));
app.post('/remove-item', asyncRequest(item.bind(null, 'remove)));

可能您尝试在自定义asyncRequest函数上调用item,该函数包含4个参数,这不是asyncRequest函数对其handler参数的期望。