介绍
当我们在开发 Web 应用的时候,中间件是一个不可避免的部分。中间件是处理请求和响应的函数,可以添加到请求响应周期的不同阶段中。有时候我们需要使用特定的中间件来处理请求,而有时候又需要将请求处理委托给其他中间件,这需要我们根据某些条件进行中间件判断。
在 Node.js 中,我们可以通过编写自己的中间件来解决这个问题,但是这需要对中间件的原理有一定的了解。但如果我们使用已经编写好的中间件库,就可以避免编写和维护自己的中间件。
此处介绍的是 npm 包 conditional-middleware
,它是一个轻量级的 Node.js 中间件,基于 express.js
、connect
和 http-proxy
。提供了一个类似于 switch case
控制结构的 API 以便根据不同的条件来应用中间件。下面是如何使用 conditional-middleware
及其功能的详细指南。
安装
你可以使用 npm 来安装最新版本的 conditional-middleware
,安装命令如下:
npm install conditional-middleware
安装后,你可以在代码中引入 conditional-middleware
,同时它是一个通用的中间件,可以不仅仅用于 express
应用程序中。
var conditional = require('conditional-middleware');
使用
Basic
对于基本用法,你可以按如下所示编写代码:
app.use(conditional(someCondition, someMiddleware1, someMiddleware2));
这个例子中,someCondition
是表示中间件是否需要被应用到当前请求中的布尔表达式,如果为 true
,则第二和第三个参数(someMiddleware1
和someMiddleware2
)将被应用。如果为 false
,则继续向下执行并跳过后面的任何中间件。如果你只想使用一个中间件,那么你可以这么写:
app.use(conditional(someCondition, someMiddleware));
Multiple conditions
你也可以应用多个中间件,如果多个条件都为真,则所有相关的中间件都会应用于当前请求,例如:
app.use(conditional(someCondition1, someMiddleware1)); app.use(conditional(someCondition2, someMiddleware2)); app.use(conditional(someCondition3, someMiddleware3));
Custom error handler
你可以通过定义自己的错误处理函数来处理不满足条件的请求。默认情况下,如果 conditional-middleware
不想应用中间件,则会返回 HTTP500 错误,但是你可以提供自己的错误处理函数来处理这些情况,例如:
app.use(conditional(someCondition, someMiddleware, errorHandler));
在上面的代码中,如果中间件不满足某个条件,那么错误处理程序将被调用,你可以在这里定义自己的逻辑。
例如:
var errorHandler = function (req, res, next) { res.send('Sorry, the middleware cannot be used with the current parameters!'); };
Template engine
当你需要根据某些条件选择使用不同的模板引擎时,你可以使用 conditional-middleware
,例如:
-- -------------------- ---- ------- --- ---------- - ------------------------------ --- ---- - ---------------- --- -------------------- - ------------- - -- ------------------------- - ------ ------------- - ---- - ------ ------- - -- ---------------------------------- -----------------------
在这个例子中,chooseTemplateEngine()
函数返回了一个中间件,该中间件根据不同的条件将其他模板引擎应用于请求。你可以定义自己的逻辑和模板引擎来适应你自己的应用程序。
示例代码
下面是使用 conditional-middleware
的完整示例代码:
-- -------------------- ---- ------- --- ------- - ------------------- --- --------- - ----------------------------- --- ----------- - ---------------------------------- --- ---------- - ------------------------------ --- ---- - ---------------- --- --- - ---------- --- ------ - ----------------- --------------- -------------------- ------------- ---- ----- - --- -------------------- - ------------ -------------- ------- -------- ----- --- --- -------------- - ---------------- --- -------------------- - ------------- - -- ------------------------- - ------ --------------------- - ---- - ------ --------------- - -- --- ----------- - ----- ------ ------------------------------- --- ----- ------ ----------------------- -------------------- ------ ------------ ---------- --------- --- --- ------------ -------- ---------------- ---------- - -------------------- --- --------- -- ---- -------- ---
在上面的代码中,我们首先声明了 express
并创建了一个新的路由。然后,我们将一个字符串赋值给 companyName
。然后,我们将用户代理信息中间件应用于根目录的路由。接下来,我们将分别定义 swigMiddleware
和 handlebarsMiddleware
中间件,具体根据需要选择使用。然后,我们将定义一个 chooseTemplateEngine()
函数,以根据需要返回适当的中间件。然后我们应用了条件中间件 conditional()
,在这个例子中,如果 companyName
等于 'ACME Inc.',中间件将被选择应用于当前请求。
最后,我们将使用上面选择的不同的模板引擎渲染页面,同时定义渲染所需要的变量和其他辅助内容。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600556fb81e8991b448d3e18