ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

w
worc

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

要设置中间件,您可以为要添加的每个中间件层调用 app.use(<specific_middleware_layer_here>)(它可以对所有路径通用,或者仅在服务器处理的特定路径上触发),它将添加到您的 { 2} 中间件栈。中间件层可以在 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 分支
T
Tyrese

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


与其他多段解释相比,您的单句答案可以立即理解并且更有帮助。
s
sparsh

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 thx 链接(虽然第一个现在坏了)。作为记录,第二个链接中文档的开头说“将给定的中间件句柄用于给定的路由,默认为 /。这个“路由”是中间件的挂载点,当给定的值不是 /中间件仅在请求路径名中存在该段时才有效。例如,如果我们要在 /admin 上挂载一个函数,它将在 /admin 和 /admin/settings 上调用,但不会在 / 上调用, 或 /posts”。简单的 :)
O
Omkar Mote

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


S
Shubham Verma

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”,更容易理解。
M
Mike

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

例如:

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

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

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


点评来源: 我们真的需要这个线程中的另一个答案吗?
R
Rachid O
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 指向下一个注册的中间件链的第一个中间件函数。


P
Perostek Balveda

app.use() 像这样工作:

在节点 http 服务器实例上触发的请求事件。 express 使用 req 对象进行一些内部操作。这是 express 开始做你用 app.use 指定的事情的时候

这很简单。

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


N
Namrata Karmakar

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

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

应用级中间件 路由器级中间件

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

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

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

*示例:身份验证中间件 - 在待办事项应用程序中,一旦已创建的用户登录,他就会获得一个 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”?
@AkinZeman,是的,在这个特定场景中,以 /api 开头的路径都需要 JWT 令牌,而登录和注册路径不需要令牌。
s
saurabh kumar

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

如果我们使用 app.use()

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


c
chetan awate

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

M
Mosius

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 可以做什么。我只需要知道它是什么(以及任何了解如何自己进行更多研究的背景知识)。
p
pravin poudel

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

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

中间件的用途和用途:-

检查会话是否过期以进行用户身份验证和授权检查 cookie(过期日期)在响应之前解析数据


中间件是传递给 app.use() 的函数。
G
Gal Margalit

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


R
Rubin bhandari

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

佚名

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


感谢您的回答,但我相信所有这些信息都已包含在其他答案中
b
barbsan

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

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

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

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


O
Osama Bari

app.use 是应用程序级中间件

使用 app.use() 和 app.METHOD() 函数将应用程序级中间件绑定到应用程序对象的实例,其中 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() 的函数
u
user3022150

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

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

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

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

将多个中间件函数传递给 app.use 时,需要在每个中间件函数内调用 next() 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();
    })

R
Rajeev Kumar Verma

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


S
Snivio

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

例子:

app.use("/test",functionName)

和 functionName 位于不同的文件中


感谢您的回答,但我相信所有这些信息都已包含在其他答案中。
P
Piyush Jain

app.use
由 express(nodejs 中间件框架 ) 创建
app.use 用于在初始化过程中执行任何特定查询
server.js(node)
var app = require('express');
app.use(bodyparser.json())
所以每次服务器启动< /强>


J
Johnathan

您可以使用 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 让程序继续其过去的逻辑。


O
OBrien Evance

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

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


N
Nouman Dilshad

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

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

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


R
Rifky Niyas

将为每个请求调用 app.use()GETPOSTPUTPATCHDELETE


S
Synchro

假设我们有一组我们的网站可以处理的路线

app.get('/1/', function(req, res) {
    res.send('page1');
});

app.get('/2/', function(req, res) {
    res.send('page2');
});

显然,如果请求了一个我们不处理的地址,那么应该返回一个 404 错误。但是,Express 默认情况下不执行此操作。但它很容易实现。

特殊方法 app.use 将帮助我们解决这个问题。它允许您拦截所有原始地址

让我们使用这个方法返回一个 404 错误

app.use(function(req, res) {
    res.status(404).send('not found');
});

现在让我们来完成我们的构造app.get

app.get('/1/', function(req, res) {
    res.send('page1');
});

app.get('/2/', function(req, res) {
    res.send('page2');
});

app.use(function(req, res) {
    res.status(404).send('not found');
});

J
Jone Polvora

app.use(req, res, next) 是一种 API,它允许我们将一个或多个中间件添加到 express 的请求管道中。中间件是具有定义签名的函数,通过它,您可以修改或结束请求,根据您编程的条件返回响应。例如,我可以调用 res.end() 并完成对客户端的请求。中间件按照它们添加的顺序执行。我可以简单地装饰 req 对象,添加或删除属性,例如,验证用户并设置 req.user = '数据库的任何用户',然后调用 next(),下一个中间件将开始执行,接收相同的实例req,res,下一个。


j
jatin gupta

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

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

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

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


v
vishal sharma

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