Express.js中如何获取浏览器地址栏路径(排除静态资源请求)
解决方案
方法1:调整中间件挂载顺序(最简便)
Express 中间件按注册顺序执行,express.static 匹配到静态资源后会直接返回资源并结束响应,不会进入后续中间件。只要把静态资源中间件注册在日志中间件前面即可,静态资源请求不会被日志中间件捕获:
const express = require('express'); const app = express(); // 先注册静态资源处理中间件 app.use(express.static('public')); // 再注册日志中间件,仅非静态资源请求会走到这里 const requestLog = require('./你的日志中间件文件路径'); app.use(requestLog); // 后续注册业务路由 app.get('/', (req, res) => { res.send('首页'); })
方法2:在日志中间件内过滤静态资源请求
如果你的静态资源分散存储、或调整中间件顺序会影响其他逻辑,可以直接在日志中间件内添加静态后缀过滤规则:
const fs = require('fs'); // 定义需要排除的静态资源后缀列表,可根据自己的业务场景增减 const staticExts = ['.css', '.js', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.eot', '.webp', '.mp3', '.mp4']; module.exports = function (req, res, next) { // 校验当前请求是否为静态资源请求 const isStaticReq = staticExts.some(ext => req.originalUrl.toLowerCase().endsWith(ext)); if (!isStaticReq) { // 注意:原代码writeFileSync会覆盖历史日志,改为appendFileSync实现追加写入 fs.appendFileSync('log.txt', req.originalUrl + '\n'); } next(); }
注意事项:如果你有业务路由的路径刚好以上述静态后缀结尾,方法2会出现误过滤,优先推荐使用方法1,逻辑更准确。如果你的应用是SPA单页应用且使用哈希路由(地址带
#),#后的内容不会发送到服务端,属于HTTP协议默认规则,服务端无法获取#后的路径部分。
内容的提问来源于stack exchange,提问作者Javi Herrera
相关产品推荐
相关产品推荐

