Express框架中如何返回404的JSON响应及相关疑问
Express 404错误处理相关疑问解答
先看Express预设的404错误处理代码:
// catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
疑问解答
你的理解完全正确:
createError(404)会生成一个符合Express规范的HttpError对象,调用next(err)后,这个错误对象会被后续带有4个参数(err, req, res, next)的错误处理中间件捕获——也就是代码里第二个app.use的回调函数,通过err参数就能拿到这个404错误对象。这段代码的作用是控制错误信息的暴露范围:
- 开发环境下,把完整的
err对象赋值给res.locals.error,渲染错误页面时能显示详细的错误栈、代码位置等信息,方便开发调试。 - 生产环境下返回空对象,是为了避免泄露敏感信息:完整的错误对象可能包含服务器路径、依赖版本、代码细节等,这些信息如果暴露给用户,可能被黑客利用来攻击服务器,所以生产环境只返回必要的错误提示,不暴露内部细节。
- 开发环境下,把完整的
是的,但可以更精准处理:
如果只想给404返回JSON,最好先判断错误状态码,避免把所有错误都改成JSON响应。修改后的错误处理中间件示例:app.use(function(err, req, res, next) { res.status(err.status || 500); if (err.status === 404) { // 404返回JSON res.json({ message: "404 Not Found" }); } else { // 其他错误保持原有页面渲染逻辑 res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; res.render('error'); } });如果要所有错误都返回JSON,直接把
res.render('error')换成res.json({ message: err.message, error: res.locals.error })即可。两种简便方式设置JSON内容类型:
- 用Express内置方法
res.json():这个方法会自动把响应头的Content-Type设为application/json,同时把传入的对象序列化为JSON字符串,是最推荐的方式,比如res.json({ message: "404 Not Found" })。 - 手动设置响应头:调用
res.set('Content-Type', 'application/json'),放在res.send()之前,但不如res.json()便捷。
- 用Express内置方法
内容的提问来源于Stack Exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

