【问题标题】:NodeJS / Express: what is "app.use"?NodeJS / Express:什么是“app.use”?
【发布时间】:2012-07-04 12:25:46
【问题描述】:

docs for the NodeJS express module中,示例代码有app.use(...)

use 函数是什么,它在哪里定义?

【问题讨论】:

  • 文档对于初学者来说有点神秘
  • 上面可能的重复是互相引用
  • 文档完全不清楚
  • @KansaiRobot 我是初学者,很高兴看到有人认为这并不简单!

标签: node.js express


【解决方案1】:

应用程序对象在创建 Express 服务器时被实例化。它有一个中间件堆栈,可以在app.configure()(this is now deprecated in version 4.x) 中自定义。

要设置您的中间件,您可以为要添加的每个中间件层调用app.use(<specific_middleware_layer_here>)(它可以对所有路径通用,或者仅在您的服务器处理的特定路径上触发),它将添加到您的 Express 中间件堆栈上。中间件层可以在use 的多次调用中一层一层地添加,甚至可以在一次调用中一次全部添加。 详情请见use documentation

举个例子来理解 Express 中间件的概念,这是我的应用程序中间件堆栈 (app.stack) 在将我的应用程序对象作为 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] } ]

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

每一层本质上都是添加一个函数,专门处理通过中间件的流程。

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

【讨论】:

  • 谢谢。快递员在他们的 API 文档中解释这一点会很困难吗?
  • 所以你的意思是,当收到请求时,数据在到达实际服务之前会通过这些解析器。例如:Valid Request->Authentication->ProcessesRequest->ServResponse USE 会以特定顺序控制这些步骤,而不是并行执行它们?
  • 那么 app.use() 依赖注入在起作用吗?
  • 发送到 app.use 的函数什么时候调用?在创建快速服务器之后还是针对每个请求?
  • @KevinC。不,这不是依赖注入。它是一个插件架构。通常这种架构被称为过滤系统/过滤管道/管道和过滤器。在 Express 中,管道是 next() 回调,每个中间件都应调用以将处理传递给管道中的下一个函数。路由系统(app.use() 的第一个参数)允许管道根据 URL 进行分支
【解决方案2】:

每次向服务器发送请求时,都会调用每个 app.use(middleware)

【讨论】:

  • 你的单句答案比其他多段解释更容易理解,更有帮助。
【解决方案3】:

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

Update 从 4.x 版本开始,Express 不再依赖于Connect

以前包含在 Express 中的中间件功能现在位于单独的模块中;见list of middleware functions

【讨论】:

  • 如果 Node 中间件实例化对象会更高效吗?这是否意味着在每个请求中,中间件都会实例化新对象?旧物品会被丢弃吗?例如app.use(function(){ var object = new SomeConstructor; next(); })
  • @CMCDragonkai 可以在每个请求上实例化对象。只要您不存储对请求处理程序范围之外的对象的引用,它们就会被垃圾收集。
  • @AlexanderBird 感谢链接(虽然第一个现在已经坏了)。作为记录,第二个链接中文档的开头说“将给定的中间件句柄用于给定的路由,默认为 /。这个“路由”是中间件的挂载点,当给定的值不是 /中间件仅在请求路径名中存在该段时才有效。例如,如果我们要在 /admin 上挂载一个函数,它将在 /admin 和 /admin/settings 上调用,但不会在 / 上调用, 或 /posts”。简单:)
【解决方案4】:

app.use() 在快速应用中充当中间件。与 app.get()app.post() 左右不同,您实际上可以在不指定请求 URL 的情况下使用 app.use() .在这种情况下,它的作用是,无论点击什么 URL,每次都会执行。

【讨论】:

  • 非常简洁。谢谢!
【解决方案5】:

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

例如: 如果你在 indexRouter.js 中使用 app.use(),像这样:

//indexRouter.js

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

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

在上面的代码 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;

在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.

    });

【讨论】:

  • 我会用“map”代替“mount”,这样更容易理解。
【解决方案6】:
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware2(req, res, next){
   // middleware2 logic
}, ... middlewareN);

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

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

【讨论】:

  • 像魅力一样工作!!
【解决方案7】:

app.use() 是这样工作的:

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

这很简单。

只有这样 express 才能完成其余的事情,比如路由。

【讨论】:

    【解决方案8】:

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

    例如:

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

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

    【讨论】:

    • 点评来源: 我们真的需要这个线程中的另一个答案吗?
    【解决方案9】:

    如果我们在快递 从“快递”进口快递 并使用 app = express(); 然后应用程序具有 express 的所有功能

    如果我们使用 app.use()

    在整个 express 项目中使用任何模块/中间件功能

    【讨论】:

      【解决方案10】:

      app.use 可作为应用请求的中间件。 语法

      app.use('pass request format',function which contain request response onject)
      

      例子

      app.use('/',funtion(req,res){
       console.log(all request pass through it);
      // here u can check your authentication and other activities.
      })
      

      您也可以在路由请求时使用它。

      app.use('/', roting_object);
      

      【讨论】:

        【解决方案11】:

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

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

        1. 应用级中间件
        2. 路由器级中间件

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

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

        在这里,路径是可选的。如果未指定路径,则应用程序每次收到请求时都会执行该函数,而不管访问的是哪个 URL。

        *示例:
        Auth 中间件 - 在 To-Do 应用中,一旦已经创建的用户登录,他就会获得一个 JWT 令牌,每次用户发出 GET、PUT、PATCH、POST 或 DELETE 请求时都必须验证该令牌。

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

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

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

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

        【讨论】:

        • 这个解释更准确地回答了这个问题。
        • 所以对于登录或登录页面,我们不能使用路由路径 "/api/login" "/api/signup" ?
        【解决方案12】:

        app.use 是一个需要中间件的函数。例如:

         app.use('/user/:id', function (req, res, next) {
               console.log('Request Type:', req.method);
                next();
             });
        

        此示例显示了安装在/user/:id 路径中的中间件功能。该函数针对/user/:id路径中的任何类型的HTTP请求执行。

        和REST Web Server类似,只是用不同的/xx代表不同的动作。

        【讨论】:

        • 感谢您的回答,但由于其他人已经说出了所有这些信息,我不会赞成这个。我认为我不需要对 express use 可以做什么的所有解释;我只需要知道它是什么(以及任何了解如何自己进行更多研究的背景知识)。
        【解决方案13】:

        app.use() 是一种允许我们注册中间件的方法。

        中间件方法就像java中的一个拦截器,这个方法总是对所有请求执行。

        中间件的用途和用途:-

        1. 检查会话是否过期
        2. 用于用户身份验证和授权
        3. 检查 cookie(到期日期)
        4. 在响应之前解析数据

        【讨论】:

        • 中间件是传入app.use()的函数。
        【解决方案14】:

        中间件是用于“粘合在一起”的软件的总称,因此 app.use 是一个配置中间件的方法,例如:解析和处理请求体: app.use(bodyParser.urlencoded({extended: true })); app.use(bodyParser.json()); 您可以在 express 应用程序中使用许多中间件 只需阅读文档: http://expressjs.com/en/guide/using-middleware.html

        【讨论】:

          【解决方案15】:

          app.use 将指定的中间件应用到主应用中间件堆栈。将中间件附加到主应用程序堆栈时,附加顺序很重要;如果在中间件 B 之前附加中间件 A,中间件 A 将始终首先执行。您可以指定特定中间件适用的路径。在下面的示例中,“hello world”将始终在“happy holiday”之前记录。

          const express = require('express')
          const app = express()
          
          app.use(function(req, res, next) {
            console.log('hello world')
            next()
          })
          
          app.use(function(req, res, next) {
            console.log('happy holidays')
            next()
          })
          

          【讨论】:

            【解决方案16】:

            它使您可以使用任何中间件 (read more),例如 body_parserCORS 等。中间件可以更改 requestresponse 对象。它也可以执行一段代码。

            【讨论】:

            • 感谢您的回答,但我相信所有这些信息都已包含在其他答案中
            【解决方案17】:

            您还可以创建自己的中间件功能,如

            app.use( function(req, res, next) {
              // your code 
              next();
            })
            

            包含三个参数reqresnext
            您还可以使用它来验证和验证输入参数,以保持您的 控制器清洁。

            next() 用于转到下一个中​​间件或路由。
            您可以从中间件发送响应

            【讨论】:

              【解决方案18】:

              app.use 是应用级中间件

              使用 app.use() 和 app.METHOD() 函数将应用级中间件绑定到 app 对象的实例,其中 METHOD 是中间件函数处理的请求的 HTTP 方法(例如 GET、 PUT 或 POST) 小写。

              您可以使用来检查所有请求,例如,您要检查令牌/访问令牌,您需要编写一个中间件,使用 app.use 来检查请求中的令牌。

              这个例子展示了一个没有挂载路径的中间件函数。每次应用收到请求时都会执行该函数。

              var app = express()
              
              app.use(function (req, res, next) {
                console.log('Time:', Date.now())
                next()
              })
              

              来自https://expressjs.com/en/guide/using-middleware.html的参考

              【讨论】:

              • app.use() 不是中间件。中间件是传入 app.use() 的函数
              【解决方案19】:

              app.use(path, middleware)用于调用对应路径命中路由前需要调用的中间件函数。一个 app.use 可以调用多个中间件函数。

              app.use('/fetch', enforceAuthentication) -> 当请求以 '/fetch 开头时,将调用 enforceAuthentication 中间件 fn ' 已收到。可以是/fetch/users/fetch/ids/{id}

              无论请求如何,都可能必须调用一些中间件函数。对于这种情况,没有指定路径,因为路径默认为 / 并且每个请求都以 /,所有请求都会调用这个中间件函数。

              app.use(() => { // 初始化一个通用服务 })

              next() 当多个中间件函数传递给 app.use 时,需要在每个中间件函数内调用 fn,否则下一个不会调用中间件函数。

              参考:http://expressjs.com/en/api.html#app.use

              注意:文档说我们可以通过在当前中间件函数中调用 next('route') 来绕过当前中间件函数,但是这种技术 在 app.use 中对我不起作用,但 确实适用于 app.METHOD,如下所示。因此,调用了 fn1 和 fn2,但没有调用 fn3。

              app.get('/fetch', function fn1(req, res, next)  {
                  console.log("First middleware function called"); 
                      next();
                  }, 
                  function fn2(req, res, next) {
                      console.log("Second middleware function called"); 
                      next("route");
                  }, 
                  function fn3(req, res, next) {
                      console.log("Third middleware function will not be called"); 
                      next();
                  })
              

              【讨论】:

                【解决方案20】:

                使用 app.use() 和 app.METHOD() 函数将应用级中间件绑定到 app 对象的实例,其中 METHOD 是中间件函数处理的请求的 HTTP 方法(例如 GET、 PUT 或 POST) 小写。

                【讨论】:

                  【解决方案21】:

                  简而言之 app.use() 支持所有类型的请求 [eg:get,post,...] 所以它主要用于设置中间件。 或者可以用于路由和功能分离的时候

                  示例:

                  app.use("/test",functionName)
                  

                  和functionName位于不同的文件中

                  【讨论】:

                  • 感谢您的回答,但我相信所有这些信息都已包含在其他答案中。
                  【解决方案22】:

                  app.use
                  由 express(nodejs 中间件框架)创建
                  app.use 用于在 intilization 过程中执行任何特定查询
                  server.js(节点)
                  var app = require('express');
                  app.use(bodyparser.json())
                  所以每次 server up

                  都会调用 app.use 函数

                  【讨论】:

                    【解决方案23】:

                    您可以使用app.use('/apis/test', () => {...}) 为您的 api 编写中间件,以处理一个或某些操作(身份验证、验证数据、验证令牌等),然后再进行进一步处理或在您满足条件时使用特定状态码进行响应给不合格。

                    例子:

                    var express = require('express')
                    var app = express()
                    
                    app.use(function (req, res, next) {
                      // Your code to handle data here
                      next()
                    })
                    

                    更详细的是,这部分实际上是一个匿名函数,供您在运行时编写逻辑

                    function (req, res, next) {
                       // Your code to handle data here
                       next()
                    }
                    

                    您可以将它从另一个文件中拆分成另一个函数并使用module.export 来使用

                    next() 这里的逻辑是,如果你处理一切都很好,那么你可以使用 then 让程序继续它过去的逻辑。

                    【讨论】:

                      【解决方案24】:

                      app.use() 函数用于在指定路径挂载指定的中间件函数。它主要用于为您的应用程序设置中间件。
                      语法
                      app.use(path, callback)
                      参数:

                      1. path:它是调用中间件函数的路径。它可以是表示路径或路径模式或正则表达式模式以匹配路径的字符串。
                      2. callback:它是一个中间件函数或一系列/数组中间件函数。

                      【讨论】:

                        【解决方案25】:

                        简单来说app.use()是一个函数,它接受另一个函数(回调)作为参数,每次请求发送到快速应用程序/服务器时都会运行。

                        app.use内部传递的函数也称为中间件,中间件只是express app中存在的函数的一个花哨名称,具有三个参数request、response和next。你可以阅读更多关于middleware的信息。

                        在请求和响应周期之间调用中间件。如果您希望在所有路由上应用中间件,则可以使用app.use() 或进行一些验证、错误检查和其他操作。

                        【讨论】:

                          【解决方案26】:

                          每个请求都会调用app.use()GETPOSTPUTPATCHDELETE

                          【讨论】:

                            【解决方案27】:

                            顾名思义,它充当路由中的中间件。

                            假设对于任何单个路由,您希望在发送响应之前调用多个 url 或在内部执行多个函数。 您可以使用此中间件并传递您的路由并执行所有内部操作。

                            syntax:
                            app.use( function(req, res, next) {
                              // code
                             next();
                            })
                            

                            next 是可选的,您可以使用此参数将结果传递给下一个函数。

                            【讨论】:

                              【解决方案28】:

                              app.use() 是应用程序中间件。 使用应用程序将应用程序级中间件绑定到应用程序对象的实例。使用()和应用程序。 METHOD() 函数,其中 METHOD 是中间件函数处理的请求的 HTTP 方法(例如 GET、PUT 或 POST)

                              var express = require('express');
                              var app = express();
                              var PORT = 3000;
                              
                              // This middleware will not allow the
                              // request to go beyond it
                              app.use(function (req, res, next) {
                                  console.log("Middleware called")
                                  next();
                              });
                                  
                              // Requests will never reach this route
                              app.get('/user', function (req, res) {
                                  console.log("/user request called");
                                  res.send('Hello test');
                              });
                              
                              app.listen(PORT, function(err){
                                  if (err) console.log(err);
                                  console.log("Server listening on PORT", PORT);
                              });
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2016-10-25
                                • 1970-01-01
                                • 1970-01-01
                                • 2019-11-14
                                • 2018-02-11
                                • 2015-02-14
                                • 1970-01-01
                                相关资源
                                最近更新 更多