Angular Http Module被认为是中间件?

Posted

技术标签:

【中文标题】Angular Http Module被认为是中间件?【英文标题】:Angular Http Module considered middleware? 【发布时间】:2017-06-27 10:05:42 【问题描述】:

我试图完全理解什么是中间件,但我遇到了一个难题。

我正在阅读 expressJs 文档及其对中间件函数的定义,即“中间件函数是可以访问请求对象 (req)、响应对象 (res) 和下一个中间件函数的函数应用程序的请求-响应周期。下一个中间件函数通常由名为 next 的变量表示。

我知道下一个变量不必将其命名为“下一个”以具有函数。

我也知道中间件(如 monogJs)和中间件函数/方法(app.use())之间是有区别的。在 Angular 中,http 模块也遵循这种模式,Angular 和其他流行框架中的其他东西也是如此。这些是否也被视为中间件?有人可以为我澄清一下吗?

【问题讨论】:

不,中间件在浏览器和http服务器之间 【参考方案1】:

中间件是在每个请求之前和之后执行的一段代码。这有助于您创建共享功能,例如日志记录和授权,而无需为每个端点实现代码。

中间件的顺序通常称为中间件链。

app.use(middleware)

这是我们将中间件附加到每个请求的方式。当涉及到数据库连接时,我们倾向于将其排除在请求端点之外,因为它是应用程序全局的。

现在,我们接下来的原因是在函数完成时告诉链。这是一个回调模式。我们还希望能够在链中发现错误(异常),以便我们可以为我们的应用程序添加共享功能。 javascript 没有类型定义,因此我们注册两个函数之间差异的唯一方法是注册参数的数量。这就是错误处理有 4 个参数的原因。

这是一个带有日志记录和错误处理的端点示例

app.use(function(req, res, next) 
  console.log('request made to server');
  next();
);

app.use(function(error, req, res, next) 
  console.log('an error occurred in the code');
  next();
);

app.get('/', function(req, res) 
  /* Your logic here */
);

如果您有特定的中间件只希望用于少数端点,您可以直接注册它们

app.get('/', middleware, function(res, res) 
  /* Your logic here */
);

我希望这有助于理解中间件。中间件是处理堆栈的一部分,而不是协议调用。

【讨论】:

嘿,谢谢!你提供了一个很好的解释,但我认为这就是我的困惑所在。 angular 中的 http 模块具有 .then 方法,使您能够以任何您喜欢的方式处理响应,类似于中间件。您甚至可以将其传递给另一个函数以继续处理。那么是什么让中间件与众不同呢? Http 是一个异步调用。因为从服务器获得响应需要 n 时间。如果这在 JavaScript 中不可用,您的应用程序将在等待数据时冻结。看看 Promises。可能会帮助您了解 .then 的全部含义。

以上是关于Angular Http Module被认为是中间件?的主要内容,如果未能解决你的问题,请参考以下文章

什么被认为是 Angular 中的观察者?

#私藏项目实操分享# 如何解决 Angular custom library module 在 ng build 时无法被识别的错误

Sails/Angular 跨域请求被阻止

angular 中的 http 请求

Angular - 组件中module.id的含义是啥?

angular.module()创建获取注册angular中的模块