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

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

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

330459 次浏览

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

更新从版本4开始。x, Express不再依赖于连接

以前包含在Express中的中间件功能现在位于单独的模块中;参见中间件函数列表

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

要设置你的中间件,你可以为你想要添加的每个中间件层调用app.use(<specific_middleware_layer_here>)(它可以是所有路径的通用路径,或者只在你的服务器处理的特定路径上触发),它将添加到你的表达中间件堆栈中。中间件层可以在use的多次调用中一个一个地添加,甚至可以在一次调用中依次添加。

.

.

.

为了给概念上理解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字段中反映为字符串。

每一层本质上都是通过中间件向流添加一个专门处理某些内容的函数。

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

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.


});

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

  1. 请求事件在节点http服务器实例上触发。
  2. <李>表达 它的一些内部操作与req对象。
  3. 这是当 Express开始执行你用app.use
  4. 指定的事情

这很简单。

只有这样,express才会做剩下的事情,比如路由。

中间件是用于“粘合在一起”的软件的总称 App.use是一个配置中间件的方法,例如:解析和处理请求体: app.use (bodyParser。Urlencoded ({extended: true})); app.use (bodyParser.json ()); 在快速应用程序中可以使用许多中间件 读一读医生的话: http://expressjs.com/en/guide/using-middleware.html < / p >

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

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

In express if we 从“express”导入快递 使用app = express(); 然后应用程序具有express

的所有功能

如果我们使用app。use()

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

use将指定的中间件应用到主应用中间件堆栈中。当将中间件附加到主应用堆栈时,附加的顺序很重要;如果你在中间件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()
})

app.use ()充当了快速应用程序中的中间件。与app.get ()app.post ()等不同,你实际上可以使用app.use ()而不指定请求URL。在这种情况下,不管URL是什么,它都会被执行。

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来表示不同的操作。

总之,app.use()支持所有类型的请求[例如:get,post,…] 所以它主要用于设置中间件。 或可用于当路由和函数分离

例子:

app.use("/test",functionName)

和functionName位于不同的文件中

它允许你使用任何中间件(阅读更多),如body_parserCORS等。中间件可以对requestresponse对象进行更改。它还可以执行一段代码。

app.use作为应用程序请求的中间件。 语法< / p >

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

您还可以创建自己的中间件函数,如

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

包含三个参数reqresnext
您还可以使用它对输入参数进行身份验证和验证,以保持您的 控制器干净。< / p >

next()用于转到下一个中间件或路由。< br > 您可以从中间件

发送响应

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

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

中间件的用途和使用:-

  1. 检查会话是否过期
  2. 用于用户认证和授权
  3. 检查cookie(有效期)
  4. 在响应之前解析数据
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函数指向下一个注册的中间件链的第一个中间件函数。

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

< p >应用程序。使用< br > 由express(nodejs中间件框架)创建
use用于在初始化过程中执行任何特定的查询
server.js(节点) < br > Var app = require('express');
app.use(bodyparser.json())
所以基本上每次< em > < / em >服务器了

时都会调用app.use函数

< em >应用程序。使用(道路、中间件)< / em >用于调用中间件函数,该函数需要在路由命中对应路径之前调用。可以通过app.use调用多个中间件函数。

< em >应用程序。使用(/取回,enforceAuthentication) < / em > -> enforcement当收到请求以' /fetch '开头时,将调用身份验证中间件fn。它可以是/获取用户/获取/ id / {id}

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

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

当多个中间件函数传递给< em > app.use < / em >时,需要在每个中间件函数中调用__abc0fn,否则下一个中间件函数将不会被调用。

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

注意:文档说我们可以通过在当前中间件函数中调用< em > next(“路线”)< / em >来绕过当前中间件函数,但这种技术在app.use中不能为我工作did work with 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();
})

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

比方说,对于任何一条路由,你想在发送响应之前调用多个url或在内部执行多个函数。 你可以使用这个中间件,传递你的路由,执行所有的内部操作
syntax:
app.use( function(req, res, next) {
// code
next();
})

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

你可以使用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为程序继续使用它所习惯的逻辑。

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

例如:

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


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

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

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

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

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

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

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

这里,路径是可选的。当没有指定路径时,每次应用程序接收到请求时,函数都会被执行,而不管击中哪个URL。

< p > *例子:
认证中间件——在一个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();
}
});
});

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

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

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

app.use()函数用于在指定的路径上挂载指定的中间件函数。它主要用于为您的应用程序设置中间件 语法< br > app.use(path, callback) < br > 参数:< br > < / p >
  1. path:它是中间件函数被调用的路径。它可以是一个字符串,表示路径或路径模式或匹配路径的正则表达式模式
  2. callback:它是一个中间件函数或一系列/数组的中间件函数。

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

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

中间件在请求和响应周期之间调用。如果你想在所有路由上应用一个中间件,那么你可以使用app.use()或做一些验证、错误检查和其他事情。

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

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

假设我们有一组站点可以处理的路由

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

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

App.use()充当中间件,使用它可以声明特定于路由的中间件

// in server.js
import Users from '../routes/Users.js'
import Posts from '../routes/Posts.js'
...
app.use('/users', Users)
app.use('/posts', Posts)
...

除此之外,您还可以使用它来声明全局中间件

app.use(cors())
app.use(express.json())

app. use()函数用于在指定的路径上挂载指定的中间件函数。它主要用于为应用程序设置中间件。