NodeJS / Express:什么是“app.use”?

时间:2012-07-04 02:20:30

标签: node.js express

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

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

27 个答案:

答案 0 :(得分:296)

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

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

为了给Express Middleware的概念性理解提供一个示例,这是我的应用程序中间件堆栈(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字段中反映为字符串。

每一层实质上都是添加一个功能,专门通过中间件处理流程。

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

答案 1 :(得分:42)

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

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

以前随Express附带的中间件功能现在位于不同的模块中;请参阅list of middleware functions

答案 2 :(得分:22)

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

答案 3 :(得分:15)

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([路径],回调,[回调]): 我们可以在同一个地方添加一个回调。

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

  // write your callback code here.

    });

答案 4 :(得分:6)

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

答案 5 :(得分:5)

app.use()的工作原理如下:

  1. 在节点http服务器实例上触发请求事件。
  2. 明示 用req对象做一些内部操作。
  3. 这是什么时候 快递开始做你用app.use
  4. 指定的事情

    非常简单。

    然后才会表达其他的东西,比如路线。

答案 6 :(得分:2)

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

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

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

App.use() 用于将*应用程序级中间件绑定到在创建 Express 服务器时实例化的 app 对象实例(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)

答案 7 :(得分:2)

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

例如:

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

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

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

答案 8 :(得分:1)

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);

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

app.use(路径,中间件) 用于调用中间件功能,该功能在为相应路径命中路径之前需要被调用。可以通过app.use调用多个中间件功能。

app.use('/ fetch',forceenAuthentication) ->当请求 以'/ fetch开头时,将调用forcenAuthentication中间件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();
    })

答案 11 :(得分:1)

app.use
由express(nodejs中间件框架)创建
app.use用于在导入过程中执行任何特定的查询
server.js(节点)
var app = require('express');
app.use(bodyparser.json())
因此,每次 服务器启动

时,都会调用基本的app.use函数

答案 12 :(得分:1)

app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

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

中间件:形成具有 3个参数req,res和next 功能/中间件功能的链。 next是回调,它引用链中的下一个中间件功能,如果链的最后一个中间件功能,则next指向下一个注册的中间稀有链的first-middleware-function。

答案 13 :(得分:1)

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

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()
})

答案 14 :(得分:1)

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

如果我们使用app.use()

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

答案 15 :(得分:1)

中间件是软件的通用术语,用于粘合在一起&#34;所以 app.use是一种配置中间件的方法,例如:解析和处理请求体:  app.use(bodyParser.urlencoded({extended:true}));  app.use(bodyParser.json()); 您可以在快速应用程序中使用许多中间件 刚阅读文档: http://expressjs.com/en/guide/using-middleware.html

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

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

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

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

答案 18 :(得分:0)

app.use()是一种中间件方法。

中间件方法就像Java中的拦截器一样,该方法始终针对所有请求执行。

中间件的用途和用途:-

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

答案 19 :(得分:0)

简而言之app.use()支持所有类型的请求[例如:get,post,...] 因此,它主要用于设置中间件软件。 或用于路线和功能分开的情况

示例:

app.use("/test",functionName)

和functionName位于不同的文件

答案 20 :(得分:0)

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的参考

答案 21 :(得分:0)

app.use是需要中间件的功能。例如:

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

此示例显示了/user/:id路径中安装的中间件功能。 /user/:id路径中的任何类型的HTTP请求都将执行此功能。

它类似于REST Web服务器,只是使用不同的/xx来表示不同的操作。

答案 22 :(得分:0)

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

比方说,对于任何一条路由,您要在发送响应之前在内部调用多个url或执行多个功能。 您可以使用此中间件并通过路由并执行所有内部操作。

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

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

答案 23 :(得分:0)

您可以使用steps: - powershell: echo "task 0" displayName: task 0 - powershell: echo "task 1" condition: or(eq(variables['Build.SourceBranch'],'refs/heads/master'), startsWith(variables['Build.SourceBranch'],'refs/heads/releases/')) displayName: task 1 - powershell: echo "task 2" condition: or(eq(variables['Build.SourceBranch'],'refs/heads/master'), startsWith(variables['Build.SourceBranch'],'refs/heads/releases/')) displayName: task 2 来为您的api编写中间件,以处理一项或多项操作(身份验证,验证数据,验证令牌等),然后再进行进一步操作或在出现条件时使用特定状态代码进行响应你给的不合格。

示例:

app.use('/apis/test', () => {...})

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

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此处的逻辑是,如果您处理了一切都很好,则可以使用该程序继续执行以前的逻辑。

答案 24 :(得分:0)

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

答案 25 :(得分:0)

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

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

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

答案 26 :(得分:0)

app.use() 将针对每个请求、GET、POST、PUT、PATCH、DELETE 调用