【问题标题】:How does next() work in express and what happens after res.send()?next() 如何在 express 中工作以及 res.send() 之后会发生什么?
【发布时间】:2021-07-25 02:28:29
【问题描述】:
const express = require('express');

const app = express();

app.use('/', (req, res, next) => {
    console.log('This always runs!');
    next();
});

app.use('/add-product', (req, res, next) => {
  console.log('In add product middleware!');
  res.send('<h1>The "Add Product" Page</h1>');
});

app.use('/', (req, res, next) => {
  console.log('In another middleware!');
  res.send('<h1>Hello from Express!</h1>');
});

app.listen(3000);

NodeJS / Express: what is "app.use"? 我从这篇文章中读到,仍然对这个程序中的控制流如何进行感到困惑。如果我访问“localhost:3000/add-product”,记录的结果是“这总是运行!在添加产品中间件!这总是运行!在另一个中间件中!”(我省略了更改线) 这是否意味着在它进入第二个 app.use 之后,正如我所了解的,每次向服务器发送请求时都会调用每个 app.use(middleware)。所以这个过程重新启动,但是为什么这次下次( ) 会导致第三个 app.use 被调用?我认为 next 会进入下一个匹配路径..

【问题讨论】:

  • 这真的取决于你打电话的路线有多具体。尝试使用路由/add-product 调用它,调用将转到第一个和第二个app.use 路由编辑:路由也应该从最具体到最不具体进行排列。因为那是匹配的顺序。
  • 我尝试用 route /add-product 调用它,结果记录到控制台就像我提到的那样,这意味着它进入第一个和第二个,然后是第一个和第三个,这对我。
  • @ansley77777723 当您调用 /add....时,第一个中间件运行并调用 next 为第二个。如您所见,第二个中间件正在结束 req res 循环。我们得到了回应。第一个中间件再次启动,但这次将转到第三个。因为我们已经收到了第二个的回复。您可以阅读有关子堆栈中间件的更多信息。

标签: express


【解决方案1】:

route 的顺序在express 中很重要

基于first come first serve的快速匹配路由,就像一个队列。

如果路由匹配,那么你作为回调传递的任何函数都会被调用。

在您的情况下: 路线1:匹配每条路线 路线2:匹配/add-product 路线3:匹配每条路线

所以检查的顺序是 1 -> 2 -> 3

所以如果我让GET 打电话给/add-product (1) 和 (2) 将被调用 以及以下日志

This always runs!
In add product middleware!

虽然拨打/ 会 导致 (1) 和 (3) 被调用。

This always runs!
In another middleware!

Next() 只是将控制权传递给下一个中间件

【讨论】:

  • "这总是运行!在另一个中间件中!这总是运行!在另一个中间件中!"这是我访问 route/ 时得到的结果。你能解释一下为什么它会重复两次吗? '从文档中读到我认为你的逻辑是正确的,但它与我所看到的不匹配,因此很混乱。
  • 也许你想把你的代码推送到一个仓库以便我们看一下?
  • 我使用的唯一代码如上(在单个app.js文件中),我没有使用任何其他文件。请您在您的计算机上尝试一下吗?
  • 我刚刚尝试了上面的代码,它没有返回两次。你用什么来运行服务器? node ? nodemon ?你用什么来制作request?邮递员?
  • 是的,我使用节点,但我不知道我用什么来提出请求..我是新手,我正在关注关于这个的教程,老师也让我感到困惑输出,但他似乎对此很高兴,所以..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2023-03-26
  • 2019-01-14
  • 1970-01-01
  • 2013-04-17
  • 2016-07-08
相关资源
最近更新 更多