node.js - Express 中间件流程
问题描述
考虑以下 Express 应用程序:
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('\n\nALWAYS')
next()
})
app.get('/a', (req, res) => {
console.log('/a: route terminated')
res.send('/a')
})
app.use((req, res) => {
console.log('route not handled')
res.send('404 - not found')
})
app.listen(3000, () => {
console.log('listening on 3000')
})
访问/a
控制台结果:
ALWAYS
/a: route terminated
ALWAYS
route not handled
有人可以解释为什么还有另一个中间件日志吗?我期待只有 2 行控制台日志。反而
ALWAYS
route not handled
已被记录。
解决方案
这是一个非常常见的混淆点。可能的原因是您进入/a
浏览器并且浏览器发出了两个请求。一为/favicon.ico
一为/a
(当您访问一个新站点时,浏览器会执行此操作,因为它们以前没有为其缓存图标 - 它们在浏览器的某些位置显示的代表网站的小字形)。
如果您在中间件和 404 处理程序中记录请求 URL,您将看到正在发生的事情的详细信息:
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('\n\nRequest for: ', req.url);
next();
})
app.get('/a', (req, res) => {
console.log('/a: route terminated')
res.send('/a')
})
app.use((req, res) => {
console.log('route not handled for ', req.url);
res.send('404 - not found');
});
app.listen(3000, () => {
console.log('listening on 3000')
})
推荐阅读
- arduino - 我不知道我的代码有什么问题,随机发生的事情
- vue.js - Vuetify - 如何在自定义构建中禁用显示助手?
- javascript - 如何在特定时间后运行一个函数,该时间由点击之类的事件触发(原生 JavaScript)
- php - CakePHP 4 和 Authentication 2 插件 - 记住我不会创建 Cookie
- android - 尝试在空对象引用 (MessageActivity.java:150) 上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”
- html - 构建后未找到 Angular 11 资产
- c# - Entity Framework 6 可以从分隔字符串列映射外键吗?
- asynchronous - 暂时挂起或停用 futures::select 中使用的间隔流
- c - 如何禁止编译器预先计算常量值的乘积
- ansible - 如何使用 json_query 过滤器提取所有项目等于一个值