首页 > 解决方案 > 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

已被记录。

标签: node.jsexpressmiddleware

解决方案


这是一个非常常见的混淆点。可能的原因是您进入/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')
})

推荐阅读