繁体   English   中英

中间件被调用以进行错误处理但不处理响应

[英]Middleware getting called for error handling but not handling response

我试图通过返回 json 来处理错误,但我的错误处理程序(在被调用时,登录控制台)不会返回我试图返回的内容。 这是处理程序:

const handleError = function(err, req, res, next) {
    console.log(err);
    res.setHeader('Content-Type', 'application/json');
    res.status(500);
    res.send(JSON.stringify(error));
}

但是我得到了一个渲染函数,它转换为作为用户返回给我的以下内容:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Invalid token with reason JsonWebTokenError: jwt malformed</pre>
    </body>
</html>

所以它仍然会记录错误,但除非我在我的实际函数中返回一个错误,否则它不会按预期返回,也就是以下函数确实返回一个 json 错误,如所写:

const view = function(req,  res, model, settings = {}, callback)  {
    let { params } = req;
    let { _id } = params;
    let { select, limit, sort } = settings;
    let query = model.findById(_id);
    if (select) query.select(select);
    if (sort) query.sort(sort);
    if (limit) query.limit(limit);
    query.exec(function(err, data) {
        if(callback) {
            callback(err,data);
        }else{
            if (err) return res.status(400).json({ 'Error': err.message });
            if (!data) return res.status(404).json({ 'Error': `No document with id ${_id} found` });
            return res.status(200).json(data);
        }
    });
}

这是我注册中间件的方法

let app = express();
app.server = http.createServer(app);

// logger
app.use(morgan('dev'));

// 3rd party middleware
app.use(cors({
    exposedHeaders: config.corsHeaders
}));

// Custom error handling 
app.use(api.handleError);

//Set body as json as recieved
app.use(bodyParser.json({
    limit : config.bodyLimit
}));

当我阅读有关错误处理的快速文档时,在我看来,您应该throw new Error() (或调用next() ,具体取决于处理程序的同步/异步性质)以获得错误处理程序在职的。

在您上面的代码中,我看到您return res.status().json() - 我认为这不是一回事。

您已经指出, unless I return an error in my actual function, it won't return as intended ——所以听起来您已经知道发生了什么。

您还提到 handleError 应该返回handleError为什么不改变这个:

res.status(500);
res.send(JSON.stringify(error));

...至...

res.status(500).json(error)

那应该给你你需要的东西。

尝试在您的路线下方添加错误处理程序中间件。 例子:

app.get('/', indexHandler)
//call next(err) in indexHandler if there is an error
app.use(errorHandler)

答案很简单 install express-async-errors https://www.npmjs.com/package/express-async-errors

run  npm install express-async-errors

并在你的 app.js 文件的顶部需要它

require('express-async-errors')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM