Express中间件
中间件的概念
中间件的概念:
中间件就是把很复杂的事情分割成单个,然后依次有条理的执行。就是一个中间处理环节,有输入,有输出。
说的通俗易懂点儿,中间件就是一个(从请求到响应调用的方法)方法。
把数据从请求到响应分步骤来处理,每一个步骤都是一个中间处理环节。
接下来我们使用Node.js创建一个HTTP服务器,并自定义三个中间件:cookie、query和post-body。 代码示例
var http = require('http'); var url = require('url'); var cookie = require('./expressPtoject/cookie'); var query = require('./expressPtoject/query'); var postBody = require('./expressPtoject/post-body'); var server = http.createServer(function(){ // 解析请求地址中的get参数 // var obj = url.parse(req.url,true); // req.query = obj.query; query(req,res); //中间件 // 解析请求地址中的post参数 req.body = { foo:'bar' } }); if(req.url === 'xxx'){ // 处理请求 ... } server.listen(3000,function(){ console.log('3000 runing...'); });
下面是对代码的解释:
var http = require('http');
这一行代码使用Node.js内置的http
模块创建了一个HTTP服务器。var url = require('url');
这一行代码使用Node.js内置的url
模块来解析URL。var cookie = require('./expressPtoject/cookie');
这一行代码导入了一个自定义的cookie
模块,该模块可能包含了一些处理HTTP cookie的代码。var query = require('./expressPtoject/query');
这一行代码导入了一个自定义的query
模块,该模块可能包含了一些解析HTTP GET参数的代码。var postBody = require('./expressPtoject/post-body');
这一行代码导入了一个自定义的post-body
模块,该模块可能包含了一些解析HTTP POST参数的代码。var server = http.createServer(function(){...});
这一行代码创建了一个HTTP服务器,并将一个匿名函数作为参数传递给createServer
方法。这个函数是一个请求处理程序,会在每个HTTP请求到达服务器时被调用。query(req,res);
这一行代码调用了导入的query
模块的函数,该函数可能会解析HTTP GET参数,并将解析结果添加到req.query
对象中。req.body = {...}
这一行代码模拟了一个HTTP POST请求的请求体,并将其添加到req.body
对象中。if(req.url === 'xxx'){...}
这一行代码判断请求的URL是否是xxx
,如果是,就处理该请求。server.listen(3000,function(){...});
这一行代码让HTTP服务器开始监听端口3000,并在服务器启动时调用一个回调函数。该回调函数输出一条消息,表示服务器已经启动。
接下来我们设计一个中间件当用户在浏览器中访问 http://localhost:3000/abc
时,服务器将处理该请求并执行 app.get('/abc', ...)
中的回调函数。在第一个回调函数中,服务器将向 req
对象添加一个 body
属性,并将其设置为一个包含 name
和 age
属性的对象。在第二个回调函数中,服务器将向控制台输出 req.body
,以及一个字符串 "/abc"。这段代码只处理 HTTP GET 请求,如果用户在浏览器中提交了 HTTP POST 请求,服务器将不会响应。
代码示例:
var express = require('express'); var app = express(); app.get('/abc',function(req,res,next){ // 同一个请求的req和res是一样的, // 可以前面存储下面调用 console.log('/abc'); // req.foo = 'bar'; req.body = { name:'xiaoxiao', age:18 } next(); }); app.get('/abc',function(req,res,next){ // console.log(req.foo); console.log(req.body); console.log('/abc'); }); app.listen(3000, function() { console.log('app is running at port 3000.'); });
上面这段代码使用了Express框架,创建了一个应用程序对象app,并监听了端口3000。在该应用程序中,使用app.get()方法创建了两个路由处理程序,路由地址均为“/abc”,并且都使用了中间件函数next()。
第一个路由处理程序使用了中间件函数,打印了字符串“/abc”,并将一个名为“body”的属性添加到req对象中。注意,在Express中,req对象和res对象在整个请求周期中都是同一个对象,因此可以在前面一个路由处理程序中将数据存储到req对象中,然后在后面的路由处理程序中进行调用。
第二个路由处理程序也使用了中间件函数,打印了字符串“/abc”,并且打印了前一个路由处理程序中存储在req对象中的“body”属性值。这个例子展示了在一个请求的生命周期中,可以有多个路由处理程序,它们可以共享req对象和res对象。
中间件的分类:
应用程序级别的中间件
可以万能匹配的中间件(不关心任何请求路径和请求方法的中间件):
app.use(function(req,res,next){ console.log('Time',Date.now()); next(); });
上面这段代码,使用 app.use()
方法将其注册到应用程序中。该中间件的作用是在每个请求处理之前打印当前时间,然后通过调用 next()
将请求传递给下一个中间件或路由处理程序。
在这个例子中,console.log('Time', Date.now())
会在每个请求到达应用程序时打印当前时间戳。next()
会将控制权交给下一个中间件或路由处理程序。如果没有其他中间件或路由处理程序,则请求处理将结束,响应将被发送回客户端。
通过使用 app.use()
注册中间件,可以确保每个请求都会通过该中间件。这对于在所有请求中添加相同的处理逻辑非常有用,比如身份验证或日志记录。 关心请求路径和请求方法的中间件:
路由级别的中间件
严格匹配请求路径和请求方法的中间件
- get:中间件
app.get('/',function(req,res){ res.send('get'); });
- post:中间件
app.post('/a',function(req,res){ res.send('post'); });
- put:中间件
app.put('/user',function(req,res){ res.send('put'); });
- delete:中间件
app.delete('/delete',function(req,res){ res.send('delete'); });
总结和思考
Express中间件(middleware)是一种用于处理HTTP请求和响应的函数。中间件函数可以访问请求对象(request object)(req)、响应对象(response object)(res),以及应用程序的下一个中间件函数(next)。中间件函数可以用来执行各种任务,例如检查用户身份验证、解析请求体、设置响应头等。
Express中间件可以是应用程序级别的或路由级别的。应用程序级别的中间件将应用于整个应用程序,而路由级别的中间件将仅应用于特定的路由或路由组。
中间件函数可以是同步的或异步的。如果中间件函数执行了next(),那么它将把请求和响应传递到下一个中间件函数。如果没有调用next(),则不会传递请求和响应到下一个中间件函数。
在Express中使用中间件非常简单。只需要使用app.use()方法将中间件函数添加到应用程序的中间件堆栈中即可。例如,下面是一个将中间件函数添加到应用程序中的示例:
const express = require('express'); const app = express(); app.use((req, res, next) => { console.log('Logging middleware'); next(); }); app.listen(3000, () => { console.log('Server started on port 3000'); });
上面的示例将“Logging middleware”输出到控制台,并调用next()将请求和响应传递给下一个中间件函数。
Express中间件是一个非常强大的功能,它使得我们能够轻松地添加各种功能和处理程序到我们的应用程序中。无论是构建Web应用程序还是API,中间件都是一个必不可少的组件。