NodeJS/Express:什么是"app.use"?

Ale*_*ird 289 node.js express

NodeJS express模块文档中,示例代码具有app.use(...).

什么是use功能,它在哪儿定义?

chi*_*hin 326

在创建Express服务器时实例化app对象.它有一个可以自定义的中间件堆栈app.configure()(现在在版本4.x中已弃用).

要设置中间件,您可以调用app.use(<specific_middleware_layer_here>)要添加的每个中间件层(它可以是所有路径的通用,或仅在您的服务器处理的特定路径上触发),并且它将添加到您的Express中间件堆栈.中间件层可以在多次调用中逐个添加use,或者甚至一次与一次调用串联添加.有关详细信息,请参阅use文档

为了给Express Middleware概念性理解提供一个例子,这是我的应用程序中间件堆栈(app.stack)在将我的app对象作为JSON记录到控制台时的样子:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]
Run Code Online (Sandbox Code Playgroud)

正如您可能推断的那样,我打电话给app.use(express.bodyParser()),app.use(express.cookieParser())等等,它们将这些表达中间件"层"添加到中间件堆栈中.请注意,路由是空白的,这意味着当我添加这些中间件层时,我指定它们在任何路由上被触发.如果我添加了一个自定义中间件层,该层仅在路径/user/:id上触发,该路径将route在上面的堆栈打印输出中的中间件层对象的字段中反映为字符串.

每个层实际上都添加了一个功能,专门处理通过中间件流动的内容.

例如,通过添加bodyParser,您可以确保您的服务器通过快速中间件处理传入请求.因此,现在解析传入请求的主体是中间件在处理传入请求时所采用的过程的一部分 - 所有这些都是因为您调用了app.use(bodyParser).

  • 谢谢.那些快递人员在他们的API文档中解释这个问题会难吗? (103认同)
  • 什么时候发送到app.use的函数被调用?创建快速服务器或每个请求后? (7认同)
  • 所以你说当收到请求时,数据会在点击实际服务之前通过这些解析器传递.例如:Valid Request-> Authentication-> ProcessesRequest-> ServResponse**USE**会按特定顺序控制这些步骤而不是并行执行它们? (4认同)
  • @Jon 在 Express 中只有**中间件。除了中间件(插件)架构之外,Express.js 不实现其他任何东西。中间件可以是任何东西。路由只是一种特殊类型的中间件(请注意,“app.get”、“app.post”等只是“app.use”周围的便利助手。实际上,您可以使用“app.get”而不是“加载中间件” app.use` 如果您不希望中间件处理 post 请求) (3认同)
  • 那么 app.use() 依赖注入在起作用吗? (2认同)
  • 很好的解释。要回答 Cyber​​Men 的问题,对您的堆栈按顺序执行的每个请求是。像这样的东西。``` 让 self = this; stack.map(function(e,i) { if(e.route === 'incomingroute') { self.call(e,self); } }); `` (2认同)
  • @KevinC。不,这不是依赖项注入。这是一个插件架构。通常,这种架构称为过滤器系统/过滤器管道/管道和过滤器。在Express中,管道是每个中间件都要调用的`next()`回调,以将处理传递给管道中的下一个函数。路由系统(“ app.use()”的第一个参数)允许管道根据URL进行分支 (2认同)

Joh*_*yHK 46

use是一种配置Express HTTP服务器对象路由使用的中间件的方法.该方法被定义为Connect of Express所基于的一部分.

  • 在线文档在这里:http://www.senchalabs.org/connect/proto.html#app.use (3认同)
  • 来源:https://github.com/senchalabs/connect/blob/master/lib/proto.js#L62 (2认同)

小智 27

每次将请求发送到服务器时,都会调用每个app.use(中间件).

  • 你的单句话答案很容易理解,并且比其他多段落解释更有帮助。 (17认同)

Shu*_*rma 15

app.use()用于挂载中间件函数或挂载到指定路径,中间件函数在基本路径匹配时执行.

例如: 如果您在indexRouter.js中使用app.use(),如下所示:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,app.use()将'/ ads'上的路径挂载到adsRouter.js.

现在在adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;
Run Code Online (Sandbox Code Playgroud)

在adsRouter.js中,ads-'/ ads/show'的路径就是这样,然后它将根据controllerIndex.ads.showAd()工作.

app.use([path],callback,[callback]): 我们可以在同一个上面添加一个回调.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });
Run Code Online (Sandbox Code Playgroud)


Jac*_*nde 11

app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware2(req, res, next){
   // middleware2 logic
}, ... middlewareN);
Run Code Online (Sandbox Code Playgroud)

app.use是一种在执行任何端路由逻辑或中间路由逻辑之前注册中间件或中间件链(或多个中间件)的方法,具体取决于中间件注册顺序。

中间件:形成具有3 个参数 req、res 和 next函数/中间件函数链。next 是回调,它引用链中的下一个中间件函数,如果链的最后一个中间件函数 next 指向下一个注册的中间件链的第一个中间件函数。


小智 9

app.use()充当快递应用程序中的中间件.与app.get()app.post()左右不同,您实际上可以使用app.use()而无需指定请求URL.在这种情况下,无论什么URL被击中,它都会被执行.

  • 这非常简洁。谢谢! (3认同)

Sag*_*rki 7

app.use()处理所有中间件功能。
什么是中间件?
中间件是在两条所有路线之间像一扇门一样工作的功能。

例如:

app.use((req, res, next) => {
    console.log("middleware ran");
    next();
});

app.get("/", (req, res) => {
    console.log("Home route");
});
Run Code Online (Sandbox Code Playgroud)

当您/在控制台中访问route 时,将打印两条消息。第一条消息将来自中间件功能。如果没有next()传递任何函数,则只有中间件函数运行,其他路由被阻塞。

  • 点评来源: 在这个线程中我们真的需要另一个答案吗? (2认同)

小智 6

app.use()的工作方式如下:

  1. 在节点http服务器实例上触发的请求事件。
  2. express对req对象进行一些内部操作。
  3. 这是Express开始执行您通过app.use指定的操作时的时间

这很简单。

然后只有express才能完成路由之类的其余工作。


Nam*_*kar 6

express 中的 .use() 方法是一个 * 中间件处理程序。Express 应用程序本质上是一系列中间件函数调用。

\n

一个 Express 应用程序可以使用 5 种不同类型的中间件,其中主要使用这两种:

\n
    \n
  1. 应用层中间件
  2. \n
  3. 路由器级中间件
  4. \n
\n

App.use() 用于将 *应用程序级中间件绑定到 app 对象的实例,该对象在创建 Express 服务器时实例化(对于路由器级中间件,使用 router.use() )。

\n

句法 :app.use(path, middleware function/s)

\n

这里,路径是可选的。如果未指定路径,则每次应用程序收到请求时都会执行该函数,无论点击了哪个 URL。

\n

*示例:
\nAuth 中间件 - 在待办事项应用程序中,一旦已创建的用户登录,就会向他提供 JWT 令牌,每次用户发出 GET、PUT、PATCH、POST 或 DELETE 请求时都必须验证该令牌。

\n
app.use("/api/*", verifyToken(req, res, next): void {\nconst jwt: string = req.headers['x-token-header'];\nif (!jwt) {\n  res.status(403).send({ message: 'No token provided!' });\n} else {\n  jsonwebtoken.verify(jwt, config.get('secretString'), (err) => {\n    if (err) {\n      res.status(403).send(err);\n    } else {\n      next();\n    }\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

这里添加了 /api 路径,以区分不需要 JWT 身份验证的请求,例如注册和登录(因为我们不希望在不需要身份验证时执行中间件)。

\n

*中间件函数是可以访问请求对象 (req)、响应对象 (res) 以及 application\xe2\x80\x99s 请求-响应周期中的下一个中间件函数的函数。下一个中间件函数通常由名为 next 的变量表示。

\n

中间件的语法:function(req, res, next)

\n