Express自定义中间件未被调用,请求返回Cannot GET /求助
问题排查与修复方案
嘿,我来帮你捋捋代码里的问题,这几个小细节导致了你的请求没得到预期响应:
错误处理中间件被误用了:你写的中间件是带
err参数的四参数形式,这是Express专门用来处理错误的中间件,只有当前面的路由/中间件通过next(err)抛出错误时才会触发,普通的GET请求根本不会走到这里,所以日志没打印也很正常。如果是要做全局生效的普通中间件,把第一个err参数去掉就行,改成(req, res, next)的形式。响应对象调用错了:你用
req.send()来返回内容,但发送响应的是res(response对象),不是req(request对象),正确写法是res.send("Hello World!")。别忘了调用
next()(可选):如果你的中间件只是做日志这类前置处理,之后还要交给其他路由处理,一定要调用next(),否则请求会一直挂起;如果想在中间件里直接返回响应,那就不用调用next()。
给你修复后的两种写法参考:
写法一:中间件做日志,路由返回响应
const express = require('express'); const app = express(); // 全局日志中间件 app.use((req, res, next) => { console.log('Time:', Date.now()); next(); // 传递请求到下一个路由/中间件 }); // 匹配根路径的GET请求 app.get('/', (req, res) => { res.send("Hello World!"); }); app.listen(3000, () => console.log('Example app listening on port 3000!'));
写法二:中间件直接返回响应
const express = require('express'); const app = express(); // 直接在中间件里处理所有请求并返回响应 app.use((req, res) => { console.log('Time:', Date.now()); res.send("Hello World!"); }); app.listen(3000, () => console.log('Example app listening on port 3000!'));
这样修改后,再访问http://localhost:3000,就能看到预期的Hello World,控制台也会打印时间日志啦。
内容的提问来源于stack exchange,提问作者Mehran
相关产品推荐
相关产品推荐

