在 ExpressJS 响应中返回异步等待 try/catch 抛出错误 [重复]

Posted

技术标签:

【中文标题】在 ExpressJS 响应中返回异步等待 try/catch 抛出错误 [重复]【英文标题】:Return async await try/catch thrown Error in ExpressJS response [duplicate] 【发布时间】:2021-01-12 16:25:05 【问题描述】:

使用 ExpressJS 4.16.0、NodeJS 10.15.0 和 KnexJS/Bookshelf,我试图弄清楚错误处理。

在我的应用程序中按预期捕获了错误,但服务器调用的响应中没有返回错误:return res.status(400).send(error);,而是得到了

我该如何解决这个问题?

用户路线:

router.post('/users/register',
  async function(req, res, next) 

    let user;

    try 
        user = await UserService.register(req.body);
     catch (error) 
        console.log('Route: Catch: ', error); // Will display error from UserService Error here: "column users.emailll does not exist"

        return res.status(400).send(error); // Sends `` back
    
    ...

用户服务:

...

try 
    user = await new User.User(
        emailll: userInput.email // Will throw error in "catch" below because "emailll" is invalid field
    ).fetch();
 catch (error) 
    // Throws error "column users.emailll does not exist"
    console.log('Service: Catch: ', error);
    throw new Error(error);

来自服务器的响应:

我假设由于async await 调用,错误正在某处被吞没?我需要使用this express-async-errors lib 之类的东西吗?

【问题讨论】:

顺便说一句 throw new Error(error); 可能只是 throw error; 【参考方案1】: 尝试发送错误消息而不是错误堆栈
return res.status(400).send(error.message);

【讨论】:

【参考方案2】:

res.send(err) 将在内部尝试将该对象转换为 JSON。默认情况下,JSON.stringify(obj) 仅包含目标对象上的可枚举属性,而您在错误对象上查找的常用属性默认情况下不可枚举。

一种解决方法是使用您要发送的任何属性制作对象的副本,并且通常将它们分配默认为可枚举:

let obj = filename: error.filename, message: error.message;
res.send(obj);

通常,您不希望将有关服务器的内部详细信息作为错误消息发回,因此通常会隐藏实现细节并发送可能对客户端更有用的消息。

所以,也许你只是想做:

res.status(500).send(error.message);

如果你真的想要 err 对象的所有属性,你也可以使用这样的辅助函数:

function makeEnumerableCopy() 
    let descriptor = Object.getOwnPropertyDescriptors(err);
    // set all properties in the descriptor to be enumerable
    for (let key of Object.keys(descriptor)) 
        descriptor[key].enumerable = true;
    
    return Object.defineProperties(, descriptor);

这将制作对象的浅表副本并使所有“自己的”属性可枚举,因此您可以将其与res.send()JSON.stringify() 一起使用并获取所有属性。

res.send(makeEnumerableCopy(err));

【讨论】:

以上是关于在 ExpressJS 响应中返回异步等待 try/catch 抛出错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

异步等待不等待 useEffect 内的响应

Java 不等待异步调用响应

Node.JS - 无法使用try / catch块获得异步抛出

如何在 Node.js expressjs 的异步对象方法中处理未处理的承诺拒绝?

expressjs不返回任何响应给html

如何在 JS 中使用 try、catch、.then 链接和异步等待来解决承诺?