express-generator 根路由"/"未触发仅改路径可用,是什么原因?
问题原因
你的根路由被优先触发的静态资源中间件拦截了,这是express-generator初始化项目的默认配置导致的:
- express-generator默认会在路由注册之前注册
express.static静态资源中间件,指向项目根目录下的public文件夹 public文件夹默认自带index.html文件,express.static中间件默认会把根路径/的请求匹配到该文件直接返回,不会向下传递到你注册的根路由- 你修改为
/movies等其他路径时,静态中间件匹配不到对应的静态文件,所以会正常交给后续的路由处理,这就是自定义路径可以生效的原因
解决方案
你可以任选以下一种方式处理:
- 禁用静态中间件的默认index匹配
修改app.js中express.static的注册代码,添加index: false配置即可:
app.use(express.static(path.join(__dirname, 'public'), { index: false }));
该方案不会影响其他静态资源的正常访问,是最推荐的处理方式。
删除public目录下的默认index.html文件
静态中间件匹配不到根路径对应的静态资源,就会将请求传递给后续的路由处理。调整中间件注册顺序
将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
相关产品推荐
相关产品推荐

