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

Express中routers.get与app.use路由失效问题求助及解决

解决Express子路由404问题:文件名拼写错误导致的路由失效

嘿,我帮你把这个问题的来龙去脉和解决办法理清楚:

你遇到的localhost/projects和localhost/projects/randomCircles返回404的核心原因,是路由文件的文件名与app.js中引入的路径不匹配,导致对应的Router模块没有被正确加载,自然这些路由就无法被Express识别。

1. 找出核心拼写错误

看你给出的代码细节:

  • 在app.js里你引入了var projectsRouter = require('./routes/projects');,但你的路由文件实际叫project.js(少了末尾的s),Node.js找不到projects.js这个文件,所以/projects相关的路由根本没注册成功。
  • 你提到直接访问/randomCircles能工作,大概率是你的实际文件名是randomCircles.js(和require路径一致),但你给出的代码里写的randomCircle.js应该是笔误~

2. 修正后的代码示例

第一步:调整文件名

把project.js重命名为projects.js,确保和app.js里的引入路径完全一致。如果想让randomCircles作为/projects的子路由,不需要单独注册它,直接在projects.js里定义即可。

修正后的app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

// 修正引入路径,确保和文件名一致
var indexRouter = require('./routes/index');
var projectsRouter = require('./routes/projects');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/projects', projectsRouter);
// 移除单独的/randomCircles路由注册,因为它作为projects的子路由存在

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

module.exports = app;

修正后的projects.js(原project.js改名后)

var express = require('express');
var router = express.Router();

/* GET projects list. */
router.get('/', function (req, res, next) {
  res.send('projects page');
});

// 这个子路由会自动拼接成 /projects/randomCircles
router.get('/randomCircles', function (req, res, next) {
  // 如果要渲染页面就用render,返回文本就用send,按需选择
  // res.render('randomCircles', {title: 'randomCircles'});
  res.send('circles');
});

module.exports = router;

3. 验证效果

修改完成后重启你的Express服务:

  • 访问localhost/:正常跳转到首页
  • 访问localhost/projects:返回projects page
  • 访问localhost/projects/randomCircles:返回circles(或者渲染对应的randomCircles页面,取决于你用send还是render)

为什么之前直接访问/randomCircles能工作?

因为你在app.js里单独注册了app.use('/randomCircles', circlesRouter);,如果你的randomCircles.js文件名和require路径一致,这个路由就能正常生效,但这并不是你想要的嵌套子路由结构。现在把它整合到projectsRouter里,就完美实现了层级路由的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:31:29