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

express-generator 根路由"/"未触发仅改路径可用,是什么原因?

问题原因

你的根路由被优先触发的静态资源中间件拦截了,这是express-generator初始化项目的默认配置导致的:

  • express-generator默认会在路由注册之前注册express.static静态资源中间件,指向项目根目录下的public文件夹
  • public文件夹默认自带index.html文件,express.static中间件默认会把根路径/的请求匹配到该文件直接返回,不会向下传递到你注册的根路由
  • 你修改为/movies等其他路径时,静态中间件匹配不到对应的静态文件,所以会正常交给后续的路由处理,这就是自定义路径可以生效的原因
解决方案

你可以任选以下一种方式处理:

  1. 禁用静态中间件的默认index匹配
    修改app.js中express.static的注册代码,添加index: false配置即可:
app.use(express.static(path.join(__dirname, 'public'), { index: false }));

该方案不会影响其他静态资源的正常访问,是最推荐的处理方式。

  1. 删除public目录下的默认index.html文件
    静态中间件匹配不到根路径对应的静态资源,就会将请求传递给后续的路由处理。

  2. 调整中间件注册顺序
    将app.use('/', indexRouter)等路由注册代码,移动到express.static中间件的注册代码之前。该方案不推荐,会导致所有静态资源请求都先经过路由匹配,降低服务性能。

额外优化建议

你当前的MongoDB连接是异步逻辑,服务启动时如果连接还未完成,收到请求时req.app.locals.collection会是undefined,触发报错。可以把app.listen启动服务的逻辑放到MongoClient.connect的回调内,确保数据库连接成功后再对外提供服务:

MongoClient.connect(uri, (err, client)=>{
    if(err) {
        console.log('we have an error: ', err)
        return
    }
    const db = client.db('MovieGoers');
    const collection = db.collection('users')
    app.locals.collection = collection;
    // 启动服务放在这里
    app.listen(3000, () => console.log('服务启动在3000端口'))
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:45:03