Node.js跨文件中间件问题:app.get回调未执行求指导
问题分析:Express路由未触发app.get回调的原因与修复方案
嘿,我帮你看了下代码,问题出在路由挂载的方式错误,还有对Express中app.use和路由逻辑的小误解,咱们一步步理清楚:
为什么app.get回调没触发?
有两个核心问题:
- 错误的中间件传递:你的
index.js导出的是一个直接修改传入app对象的函数,执行后没有返回任何值(默认是undefined)。但app.use('/t', ...)的第二个参数需要是Express中间件函数或者Router实例,你传个undefined进去不仅没用,还可能干扰正常路由逻辑。 - 路径不匹配:你在
index.js里给app挂载了app.get('/'),这个路由对应根路径http://localhost:3000/,但如果你以为访问/t路径会触发它,那肯定不行——因为这俩路径完全不搭边。
两种修复方案,任选其一就行
方案1:保持直接操作app对象,移除多余的app.use
如果你就是想给根路径加路由,那修改server.js就行,去掉那行多余的app.use('/t', ...),直接调用导入的函数给app挂载路由:
// server.js const express = require("express") const bodyParser = require("body-parser") const app = express() const routes = require('./api/index.js') const PORT = process.env.PORT || 3000 app.use(bodyParser.urlencoded({ extended: true })) app.use(bodyParser.json()) routes(app) // 直接调用函数,给app挂载根路由 var server = app.listen(PORT, function (){ var host = server.address().address var port = server.address().port console.log('Middle ware started on address http://%s:%s',host,port) })
index.js不用改,现在访问http://localhost:3000/就能触发app.get里的回调,打印we are there了。
方案2:用Express Router(推荐,模块化路由最佳实践)
如果你想把路由挂载在/t路径下,更规范的做法是用Router封装路由,而不是直接修改app对象:
首先改index.js,用Router创建路由:
// index.js const express = require('express') const router = express.Router() console.log('we are in other part of code') // 这里的路径是相对于/t的,实际访问路径是/t/ router.get('/',function(req,res){ console.log('we are there') console.log(res) res.send('Hello from /t/') // 记得加响应,不然客户端请求会挂起 }) module.exports = router
然后改server.js,把Router挂载到/t路径:
// server.js const express = require("express") const bodyParser = require("body-parser") const app = express() const tRoutes = require('./api/index.js') const PORT = process.env.PORT || 3000 app.use(bodyParser.urlencoded({ extended: true })) app.use(bodyParser.json()) app.use('/t', tRoutes) // 把Router挂载到/t路径 var server = app.listen(PORT, function (){ var host = server.address().address var port = server.address().port console.log('Middle ware started on address http://%s:%s',host,port) })
现在访问http://localhost:3000/t/就能触发回调啦~
另外提个小细节:你的app.get回调里只打印了res,但没给客户端返回响应(比如res.send()),这样客户端的请求会一直处于挂起状态,记得加上哦!
内容的提问来源于stack exchange,提问作者Tabz
相关产品推荐
相关产品推荐

