快速中间件流程

时间:2018-11-03 15:21:13

标签: node.js express middleware

考虑以下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

已被记录。

1 个答案:

答案 0 :(得分:0)

这是一个非常常见的混淆点。可能的原因是您在浏览器中转到/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')
})