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

NodeJS与Express JS:访问指定router路由时返回404错误

问题排查与解决方案

1. 首要排查点:路由导出检查

请先确认documents.js文件末尾是否正确导出了router实例,这是最容易被忽略的问题:

// documents.js 末尾添加
module.exports = router

如果没有导出语句,挂载到app上的documentsRouter实际为undefined,自然无法匹配任何路由。

2. 路由定义顺序排查

如果documents.js中/uploadDoc路由前面定义了带动态参数的路由,比如:

// 错误示例:动态路由在前,会优先匹配到/uploadDoc
router.post('/:docId', function(req, res) { ... })
router.post('/uploadDoc', function(req, res) { ... })

请将固定路径路由放到所有动态参数路由之前,避免被动态路由提前匹配拦截。

3. 中间件异步逻辑修复

你自定义的用户信息注入中间件存在异步逻辑问题,虽不是直接导致404的原因,但会引发数据异常、内存泄漏等问题,需要修改:

app.use(async function(req, res, next) {
  var user = firebase.auth().currentUser;
  res.locals.user = null;
  res.locals.url = process.env.FIREBASE_STORAGE_URL;
  if(user) {
    var usersRef = firebase.database().ref('/users');
    // 替换on为once,避免持续监听造成内存泄漏,同时等待异步查询完成
    const snapshot = await usersRef.once('value');
    const userData = snapshot.val();
    for(let rno in userData) {
      if(userData[rno].email === user.email) {
        res.locals.user = userData[rno];
        break;
      }
    }
    res.locals.userEmail = user;
  }
  next();
});

原代码中直接在异步查询外调用next(),会导致后续路由逻辑执行时用户信息还未查询完成,同时on('value')会绑定持续监听器,每次数据库数据变更都会重复触发回调。

4. 辅助验证方式

你可以在app.js中挂载documentsRouter的代码前添加临时测试路由,验证路径本身是否能被匹配:

// 放在 app.use('/documents', documentsRouter) 之前
app.post('/documents/uploadDoc', (req, res) => {
  console.log('测试路由命中');
  res.send('路由匹配正常');
})

如果临时路由能正常命中,说明问题完全出在documents.js的配置上;如果还是404,再检查是否有其他全局中间件拦截了POST请求。

附加问题修复

你当前错误处理逻辑中视图模板格式不匹配:app.js设置的视图引擎是ejs,但错误处理里渲染的是error.jade,会导致错误页加载失败,修改为:

res.render('error');

内容的提问来源于stack exchange,提问作者nlmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 05:06:04