You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');
});

疑问解答

  1. 你的理解完全正确:createError(404)会生成一个符合Express规范的HttpError对象,调用next(err)后,这个错误对象会被后续带有4个参数(err, req, res, next)的错误处理中间件捕获——也就是代码里第二个app.use的回调函数,通过err参数就能拿到这个404错误对象。

  2. 这段代码的作用是控制错误信息的暴露范围:

    • 开发环境下,把完整的err对象赋值给res.locals.error,渲染错误页面时能显示详细的错误栈、代码位置等信息,方便开发调试。
    • 生产环境下返回空对象,是为了避免泄露敏感信息:完整的错误对象可能包含服务器路径、依赖版本、代码细节等,这些信息如果暴露给用户,可能被黑客利用来攻击服务器,所以生产环境只返回必要的错误提示,不暴露内部细节。
  3. 是的,但可以更精准处理:
    如果只想给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 })即可。

  4. 两种简便方式设置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()便捷。

内容的提问来源于Stack Exchange,提问作者Manu Chadha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:47:54