我正在学习中间件教程,并且创建了将访问的 url 记录到控制台的中间件。当我在同一个文件中创建 2 个端点并使用中间件时,它会按预期记录访问控制台的 url。我决定为每个端点创建一个文件,但中间件不起作用。我认为这可能是由于文件结构造成的。我的背景是 Java,但涉足 Typescript。本应在浏览器中显示的消息也没有显示。我的目标是将消息显示到浏览器并将访问的网址显示到控制台。
索引.ts
import express from 'express';
import logger from './utilities/logger';
import route from './routes/index'
const app = express();
const port = 3002;
app.use('/sport', route)
// start the Express server
app.listen(port, () => {
console.log(`server started at http://localhost:${port}`);
});
记录器.ts
import express from 'express';
const logger = (req: express.Request, res: express.Response, next: Function):
void => {
const url = req.url;
console.log(`${url} was visited - hello`);
// next();
}
export default logger;
路线/index.ts
import express from 'express';
import football from './api/football'
import basketball from './api/basketball'
import skiing from './api/skiing'
const route = express.Router();
route.get('/', (_req, _res) => {
_res.send("Main route file");
});
route.use('/basketball', basketball);
route.use('/football', football);
route.use('/skiing', skiing);
export default route;
篮球.ts
import express from 'express';
import logger from '../../utilities/logger';
const route = express.Router();
route.get('/', logger,(_req, _res) => {
_res.send('bball!');
});
export default route;
足球.ts
import express from 'express';
import logger from '../../utilities/logger';
const route = express.Router();
route.get('/', logger,(_req, _res) => {
_res.send('footie!');
});
export default route;
文件结构
控制台输出
Expressjs 文档甚至没有记录
Request.url
的 Request
属性。他们在文档中非常清楚地指出:
不是原生 Express 属性,它是从 Node 的 http 模块继承的。Request.url
不清楚您为何登录
Request.url
。 Request.originalUrl
很像 Request.url
;但是,它保留了原始请求 URL。这就是你所需要的。它在中间件和路由器对象中都可用。
const logger = (req: express.Request, res: express.Response, next: Function): void => {
const url = req.originalUrl;
/* •••Rest of code••• */
}