如果使用快速js重载相同的路由会发生什么?

Fra*_*ard 3 javascript node.js express

我想知道如果我在expressjs中写这个会发生什么(我们假设app是一个expressjs应用程序).

app.get.use('/here' , function(req, res) {
      // EXECUTE SET OF ACTION NUMBER 1
});

app.get.use('/here' , function(req, res) {
      // EXECUTE SET OF ACTION NUMBER 2
})
Run Code Online (Sandbox Code Playgroud)

我们两次写相同的路线,但行动不同.第二个声明会超载第一个吗?

ris*_*hat 8

这取决于回调函数中发生的事情.考虑三个不同的例子:

一个)

const express = require('express');
const app = express();

app.get('/', (req, res, next) => {
  console.log('1!');
  res.json(true);
});

app.get('/', (req, res) => {
  console.log('2!');
  res.json(true);
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

b)

const express = require('express');
const app = express();

app.get('/', (req, res, next) => {
  console.log('1!');
});

app.get('/', (req, res) => {
  console.log('2!');
  res.json(true);
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

C)

const express = require('express');
const app = express();

app.get('/', (req, res, next) => {
  console.log('1!');
  next();
});

app.get('/', (req, res) => {
  console.log('2!');
  res.json(true);
});

app.listen(3000);
Run Code Online (Sandbox Code Playgroud)

在(a)案例中,工作流程是自上而下的.第一个路由处理程序启动,console.logs"1!" 并回应true.由于已发送完整响应,因此永远不会到达以下路由处理程序.

在(b)的情况下,执行在第一个路由处理程序停止.它既不响应也不允许执行更进一步.如果你curl这个应用程序,你最终会有请求超时,虽然你会看到"1!" 在控制台上.

最后,在(c)的情况下,您可以看到next函数调用.这使得Express继续执行并转到下一个路由处理程序(如果有的话).由于还有另一个路由处理程序,它会被执行,所以你最终得到"1!" 和"2!" 打印在控制台上,以及正确发送的响应.

这里有几点:

  • next如果你期望另一个路由处理程序在当前路由器之后运行,则总是调用,当你编写中间件或者像你的情况一样,你可能要添加到另一个应用程序的"类似中间件"应用程序时,这一点尤其重要,
  • 可以在多个处理程序中构建响应,例如,当第一个声明标题和/或正文时,下一个会向标题和/或正文添加内容(这很奇怪,我强烈反对你这样做),和
  • 一旦响应被发送,执行就会停止,并且不能到达任何其他路由处理程序(例如,在使用条件块时无法保证).