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
相关产品推荐
相关产品推荐

