在请求级别更改快速中间件中的全局变量。阻止获取某些请求

时间:2017-11-22 22:47:01

标签: node.js express mocking fetch

是否可以在express?

中更改请求级别的全局变量(如fetch)

我有这个中间件。

app.use((req, res, next) => {
  if(req.headers.host.startsWith('mock.')) {  // e.g. mock.myapp.com
     global.fetch = {};
  }
  next();
});

我的目的是阻止在某些请求中使用fetch,但在其他请求中允许使用{。}}。

这是否会影响后续请求?

如果可以,我该如何将此更改仅应用于当前请求。

1 个答案:

答案 0 :(得分:1)

好。可以在中间件中更改全局变量,但是执行您尝试执行的操作是不切实际的,因为node.js可以轻松地同时处理多个请求。因此,您无法真正仅为一个请求更改全局环境,这些请求不会同时影响正在处理的其他请求。

你必须强制Express序列化所有请求处理(构建某种输入队列),并且在开始处理下一个请求之前只有一个请求被处理直到完成。当然,这会破坏node.js的可扩展性。

“每个请求”环境是req对象。这就是中间件通常只会将适用于此请求的内容放在哪里。

  

我的目的是阻止在某些请求中使用fetch,但允许在其他请求中使用。

不能那样做。

  

这是否会影响后续请求?

是。您将永久更改global对象。

  

如果可以,我该如何将此更改仅应用于当前请求。

我认为我们需要了解更多关于您实际尝试解决的更高级别问题及其原因。 req对象是放置应该唯一应用于此特定请求处理的状态的典型位置,因为每个请求都有一个唯一的req对象,而一个请求对任何其他请求的对象一无所知。