在 node.js 中调用异步函数

Posted

技术标签:

【中文标题】在 node.js 中调用异步函数【英文标题】:Calling async function in node.js 【发布时间】:2018-01-04 07:38:15 【问题描述】:

我有一个异步函数

async function getPostAsync() 
  const post = await Post.findById('id');

  // if promise was successful,
  // but post with specific id doesn't exist
  if (!post) 
    throw new Error('Post was not found');
  

  return post;

我正在调用函数

app.get('/', (req, res) => 
  getPostAsync().then(post => 
    res.json(
      status: 'success',
    );
  ).catch(err => 
    res.status(400).json(
      status: 'error',
      err
    );
  )
);

但我只是收到


  "status": "error",
  "err": 

我希望得到错误Post was not found 或连接错误或类似的东西,但变量err 在我的catch 语句中只是一个空对象。

【问题讨论】:

Post.findById 是否返回一个 Promise? 是的。来自mongoose 尝试在你的catch块中发送完整的错误对象:err: JSON.stringify(err),错误对象可能不包含消息,因为err在响应中是空字符串。跨度> 当你 console.log(post) 在你的 getPostAsync() 函数中返回它之前会发生什么? 我发现模型Post没有被导入。它应该以Post is undefined 之类的方式失败。如何确保我得到这些错误? 【参考方案1】:

考虑以下几点:

let e = Error('foobar');
console.log( JSON.stringify(e) )

这输出,就像你的情况一样。那是因为错误不能很好地序列化为 JSON。

试试这个:

res.status(400).json(
  status : 'error',
  err    : err.message // `String(err)` would also work
);

【讨论】:

以上是关于在 node.js 中调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 如何使用回调调用异步函数?

当循环中调用了异步函数时,Node.JS 将如何处理循环控制?

更正 node.js 中的异步函数导出

如何从需要 return 语句的 GraphQL 解析器中调用异步 node.js 函数?

node.js异步回调

5Node.js 回调函数