对于Node中Express框架的中间件概念的感知

来源:http://www.chinese-glasses.com 作者:Web前端 人气:95 发布时间:2020-04-07
摘要:综上所述,我们可以知道,第三方中间件的安装执行是有讲究的 GET 方法 结果是输出'严格get',请求到达服务器后,从上往下逐渐匹配,匹配到第二个中间件,进入执行,但是该中间件

综上所述,我们可以知道,第三方中间件的安装执行是有讲究的

GET 方法

结果是输出'严格 get',请求到达服务器后,从上往下逐渐匹配,匹配到第二个中间件,进入执行,但是该中间件没有执行next函数,所以终止

创建 express_demo3.js 文件,代码如下所示:

所有对该服务器的请求最终都会返回404 NOT FOUND,无论是路径是什么

req.hostname / req.ip:获取主机名和IP地址

var express = require('express')var app = express() app.use(function(req,res) { res.end('404 NOT FOUND')} app.listen(3000,function(){ console.log('running...');}

接下来我们使用 Express 框架来输出 "Hello World"。

2.关心请求路径的中间件,通过app.use函数实现app.use(路径,function(req,res,next){})客户端发起的以第一个参数开头的路径才会进入该中间件以下代码为例

res.append():追加指定HTTP头

var express = require('express'); var app = express()br//中间件1app.use(function(req,res) { console.log('非严格');})br//中间件2app.use('/public',function(req,res,next) { console.log('半严格');br next();})br//中间件3app.get('/public',function(req,res) { console.log('严格 get');})br//中间件4app.post('/public',function(req,res) { console.log('严格 post');})brbr//中间件5brapp.get('/public',function(req,res) { console.log('严格 get');})

app.listen(3000,function() { console.log('running...') })

我们已经了解了 HTTP 请求的基本应用,而路由决定了由谁(指定脚本)去响应客户端请求。

3.严格匹配路径的中间件,通过app.get/app.post等实现也就是我们所说的服务器路由app.get(路径,函数)app.post(路径,函数)只有严格匹配请求方式和请求路径的请求才会进入该中间件以下面代码为例

res.clearCookie():清除Cookie

var express = require('express'); var app = express() app.use('/img',function(req,res) { console.log('半严格');}) app.get('/public',function(req,res) { console.log('严格 get');}) app.post('/public',function(req,res) { console.log('严格 post');})brbr

app.listen(3000,function() { console.log('running...') })

在浏览器中访问 http://127.0.0.1:8081/list_user,结果如下图所示:

对于一些封装请求数据方便我们操作以及处理静态资源的中间件我们应该放在路由中间件(即有发出服务器响应的中间件)之前编写,否则在编写路由时就无法使用封装好的数据。而对于返回404页面的路由可以放在所有中间件后面,这样无法找到的页面则会自动匹配到最后一个返回404页面中间件的使用是灵活多变的,本文章只是简单概述其概念及其执行机制,更多技巧仍需读者自行体会

res.redirect():设置响应的Location HTTP头,并且设置状态码302

中间件的执行机制:1.中间件的第一次执行是同步的,当一个请求发出到达服务器后,则按照顺序匹配所有中间件,当找到一个匹配时,则进入该中间件2.如果该中间件最后没有执行next函数,则该请求在此中间件终止,不再进入后面的中间件;如果有,则会直接进入后面匹配的中间件中(此时不再是按顺序!)3.重复1-2步如果把客户端发起请求和服务器发出响应比作自来水的进入水库和输出水库,那么中间件就是水库里对水分别进行过滤沉淀消毒的各个小厂房,而中间件的函数的next参数就相当于每个小厂房的门,只有这个门打开了,处理完的请求的数据才能继续向后面的中间件发送,直至响应发出。

以上命令会将 Express 框架安装在当期目录的node_modules目录中,node_modules目录下会自动创建 express 目录。以下几个重要的模块是需要与 express 框架一起安装的:

只要客户端访问该服务器的地址是以public开头(即127.0.0.1:3000/public/xxx),那么就会返回you are public 字符串

res.jsonp():传送JSONP响应

以下面的代码为例进一步说明中间件的执行顺序

静态文件

如果是下面代码,请求/public后结果又是怎样呢?

现在你可以向表单输入数据,并提交,如下演示:

中间件就是客户端http请求发起传送到服务器和服务器返回响应之间的一些处理函数。

创建 express_demo2.js 文件,代码如下所示:

时间: 2019-10-11阅读: 63标签: 中间件中间件是什么呢?

node_modules

为什么要使用中间件?通过中间件,可以对数据进行操作使得我们能方便地操作请求数据编写服务器响应。如body-parse中间件对post请求的参数进行处理让我们可以通过res.body快速获取请求参数,express-session中间件可以让我们对数据进行保存,express.static是express内置中间件,可以让我们快速处理静态资源,express.Router路由中间件等等中间件如何使用?Express中,对中间件进行了几种分类:1.不关心请求路径和请求方法的中间件,通过app.use函数实现app.use(function(req,res,next){})客户端发起的任意请求都会经过这个中间件函数进行处理next指下一个满足路径条件的中间件,如果有执行next,那么这个中间件执行完后就会执行下一个满足条件的中间件,如果没有next,就会忽略后面所有中间件以下面代码为例(设服务器ip为127.0.0.1,后面所有例子都以该ip为例)

$ node express_demo3.js应用实例,访问地址为http://0.0.0.0:8081

var express = require('express')var app = express()br// 中间件1app.get('/get/puclic',function(req,res){ res.end('get!');} // 中间件2app.post('/post/public',function(req,res) { res.end('post!');} app.listen(3000,function(){ console.log('running...');}

安装 Express 并将其保存到依赖列表中:

var express = require('express')var app = express() app.use('/public',function(req,res,next) { res.end('you are public');} app.listen(3000,function(){ console.log('running...')}

req.get():获取指定的HTTP请求头

客户端只有通过get方式访问127.0.0.1:3000/get/public时才会进入中间件1,只有通过post方式访问127.0.0.1:3000/post/public时才会进入中间件2,只有这两者完全匹配才会进入对应的中间件

First Name:
Last Name:

此时客户端访问/public,那么首先会进入中间件1,因为有执行next函数,所以直接寻找后面能够匹配的中间件,进入中间件2,中间有执行next函数,所以进入中间件3,但是中间件3没有next函数,所以不再执行,所以输出的语句是‘非严格’ '半严格' '严格 get'

res.cookie(name,value [,option]):设置Cookie

res.download():传送指定路径的文件

res.app:同req.app一样

req.baseUrl:获取路由当前安装的URL路径

requestresponse对象的具体介绍:

varexpress=require('express');varapp=express();//  主页输出 "Hello World"app.get('/',function(req,res){console.log("主页 GET 请求");res.send('Hello GET');})//  POST 请求app.post('/',function(req,res){console.log("主页 POST 请求");res.send('Hello POST');})//  /del_user 页面响应app.get('/del_user',function(req,res){console.log("/del_user 响应 DELETE 请求");res.send('删除页面');})//  /list_user 页面 GET 请求app.get('/list_user',function(req,res){console.log("/list_user GET 请求");res.send('用户列表页面');})// 对页面 abcd, abxcd, ab123cd, 等响应 GET 请求app.get('/ab*cd',function(req,res){console.log("/ab*cd GET 请求");res.send('正则匹配');})varserver=app.listen(8081,function(){varhost=server.address().addressvarport=server.address().port

req.path:获取请求路径

req.body / req.cookies:获得「请求主体」/ Cookies

执行以上代码:

res.set():设置HTTP头,传入object可以一次设置多个头

浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

req.fresh / req.stale:判断请求是否还「新鲜」

cookie-parser- 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。

Response 对象- response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:

执行以上代码:

varexpress=require('express');varapp=express();app.use(express.static('public'));app.get('/',function(req,res){res.send('Hello World');})varserver=app.listen(8081,function(){varhost=server.address().addressvarport=server.address().port

Express 提供了内置的中间件express.static来设置静态文件如:图片, CSS, JavaScript 等。

文件上传

$ node express_demo2.js应用实例,访问地址为http://0.0.0.0:8081

console.log("应用实例,访问地址为 http://%s:%s",host,port)})

app.use(express.static('public'));

res.status():设置HTTP状态码

req.is():判断请求头Content-Type的MIME类型

res.set()在res.append()后将重置之前设置的头

res.json():传送JSON响应

使用 Express 可以快速地搭建一个完整功能的网站。

index.htm 文件代码修改如下:

接下来你可以尝试访问 http://127.0.0.1:8081 不同的地址,查看效果。

请求和响应

第一个 Express 框架实例

Express 应用使用回调函数的参数:requestresponse对象来处理请求和响应的数据。

$ node server.js应用实例,访问地址为http://0.0.0.0:8081

在浏览器中访问 http://127.0.0.1:8081logo.png(本实例采用了菜鸟教程的logo),结果如下图所示:

node server.js应用实例,访问地址为http://0.0.0.0:8081

浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

req.subdomains:获取子域名

文件上传:

选择一个文件上传:

server.js 文件代码修改如下:

varexpress=require('express');varapp=express();varfs=require("fs");varbodyParser=require('body-parser');varmulter=require('multer');app.use(express.static('public'));app.use(bodyParser.urlencoded({extended:false}));app.use(multer({dest:'/tmp/'}).array('image'));app.get('/index.htm',function(req,res){res.sendFile(__dirname+"/"+"index.htm");})app.post('/file_upload',function(req,res){console.log(req.files[0]);// 上传的文件信息vardes_file=__dirname+"/"+req.files[0].originalname;fs.readFile(req.files[0].path,function(err,data){fs.writeFile(des_file,data,function(err){if(err){console.log(err);}else{response={message:'File uploaded successfully',filename:req.files[0].originalname};}console.log(response);res.end(JSON.stringify(response));});});})varserver=app.listen(8081,function(){varhost=server.address().addressvarport=server.address().port

console.log("应用实例,访问地址为 http://%s:%s",host,port)})

执行以上代码:

$ node server.js应用实例,访问地址为http://0.0.0.0:8081

浏览器访问 http://127.0.0.1:8081/index.htm,如图所示:

现在你可以向表单输入数据,并提交,如下演示:

Cookie 管理

我们可以使用中间件向 Node.js 服务器发送 cookie 信息,以下代码输出了客户端发送的 cookie 信息:

// express_cookie.js 文件varexpress=require('express')varcookieParser=require('cookie-parser')varapp=express()app.use(cookieParser())app.get('/',function(req,res){console.log("Cookies: ",req.cookies)})app.listen(8081)

执行以上代码:

$ node express_cookie.js

现在你可以访问 http://127.0.0.1:8081 并查看终端信息的输出,如下演示:

以下实例演示了在表单中通过 POST 方法提交两个参数,我们可以使用 server.js 文件内的process_post路由器来处理输入:

以下实例演示了在表单中通过 GET 方法提交两个参数,我们可以使用 server.js 文件内的process_get路由器来处理输入:

console.log("应用实例,访问地址为 http://%s:%s",host,port)})

现在你可以向表单输入数据,并提交,如下演示:

本文由10bet发布于Web前端,转载请注明出处:对于Node中Express框架的中间件概念的感知

关键词:

最火资讯