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

时间:2016-08-17 15:38:17

标签: javascript node.js express

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

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
})

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

1 个答案:

答案 0 :(得分:6)

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

A)

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);

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);

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);

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

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

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

这里有几点:

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