nodejs提供了http模块,可以自己搭建服务器,http模块使用C++实现,性能可靠。今天我们来说说node中间件。http基本用法http.createServer函数用于创建HTTP服务器,使用requestListener作为请求事件的监听函数。http.createServer([requestListener])因为该方法属于http模块,所以使用前需要引入http模块(varhttp=require(“http”))接收参数:requestListener请求处理函数,自动添加到request中event,函数传递两个参数:req请求对象,如果想知道req有哪些属性,可以查看“http.request属性集成”。resResponse对象,收到请求后要做出的响应。如果想知道res有哪些属性,可以查看“http.response属性集成”。示例:varhttp=require('http')http.createServer(function(req,res){res.writeHead(200,{"content-type":"text/plain"})res.write("hellonode")res.write("hellonode1")res.end("dkkddkdk")}).listen(3000)ExpressExpress是一个灵活的Node.jsWeb应用程序开发框架,保持最小尺寸,提供一组强大的功能。1.创建快递服务letexpress=require('express');letapp=express();//最基本的模型app.get('/',function(req,res){res.end('ok');});app.listen(3000);第二种配置路由语法:app.(path,[callback...],callback)exampleapp.get('/',function(req,res){res.send("服务器根目录");});app.post('/',function(req,res){res.send("保存页面");});三种中间件express支持的中间件组件如下:1.应用层中间件app.get("/",function(req,res,next){console.log("Matchsuccessful");next()})2.路由中间件app.get("/",function(req,res,next){console.log("匹配成功");next()})app.get("/",function(req,res){varlist=[1,6,9,8,55,66,45]res.render('index',{"list":list})})Othermiddlewarestatic:允许express服务器流式传输静态的GET请求文件。这个中间件内置于Express中,可以通过express.static()访问。express-logger:实现格式化请求记录器以跟踪对服务器的请求basic-auth-connect:提供对基本HTTP身份验证的支持。cookie-parser:可以从请求中读取cookie并在响应中设置cookie解析为req.body属性compression:为发送到客户端的大响应提供Gzip压缩支持csurf:提供跨站请求伪造保护。KOA简单应用constKoa=require('koa');constapp=newKoa();app.use(asyncctx=>{ctx.body='HelloWorld';});app.listen(3000);classKoa的中间件以更传统(你可能熟悉)的方式进行级联,摒弃了以往node频繁回调函数导致的代码逻辑复杂。然而,使用异步函数,我们可以实现“真正的”中间件。相比之下,当执行yieldnext语句时,Koa会暂停中间件,继续执行下一个满足请求的中间件('downstream'),然后逐步将控制权交还给上层中间件('upstream')。constKoa=require('koa');constapp=newKoa();//x-response-timeapp.use(async(ctx,next)=>{conststart=Date.now();awaitnext();constms=Date.now()-start;ctx.set('X-Response-Time',`${ms}ms`);});//记录器app.use(async(ctx,next)=>{conststart=Date.now();awaitnext();constms=Date.now()-start;console.log(`${ctx.方法}${ctx.url}-${ms}`);});//响应app.use(asyncctx=>{ctx.body='HelloWorld';});koa-router路由管理模块的使用constKoa=require('koa');//koa是一个类constRouter=require('koa-router')//koa路由中间件constapp=newKoa();constrouter=newRouter();//实例化路由//添加urlrouter.get('hello:name',async(ctx,next)=>{varname=ctx.params.name;//获取请求参数ctx.response.body=`你好,${name}!
`;});router.get('/',async(ctx,next)=>{ctx.response.body='Index
';});app.use(router.routes());p.listen(3333,()=>{console.log('Thisserverisrunning')})KOA和Express的比较Express和Koa都是基于Nodejs平台的web框架,目前比较常用的是快速webdevelopment服务的框架,而且都是基于中间件来处理客户端请求的,那么两者有什么区别呢?简单来说就是“Express是线性模型,Koa是洋葱模型”我们来看下面代码//forexpressexampleconstexpress=require('express');constapp=express();asyncfunctioncb1(req,res,next){console.log('>>>>>>cb1');等待下一个();console.log('<<<<<{setTimeout(resolve,500);}).then(()=>{console.log('>>>cb2<<<');res.send('helloworld');});}app.use('/',[cb1,cb2]);app.listen(3000);//对于koa2exampleconstkoa=require('koa2');constapp=newkoa();asyncfunctioncb1(ctx,next){console.log('>>>>>>cb1');等待下一个();console.log('<<<<<{setTimeout(resolve,500);}).then(()=>{console.log('>>>cb2<<<');ctx.body='helloworld';});}app.use(cb1);app.use(cb2);app.listen(3000);expressresult>>>>>>cb1>>>>>>cb1>>>cb2>>>KOA结果>>>>>>cb1>>>cb2<<<<<<<<<3){//不是标准的请求处理程序returnnext();}try{fn(req,res,next);}赶上(犯错){下一个(犯错);}};在Koa2中,执行中间件的发布代码主要位于_koa-compose/index.js_文件:functioncompose(middleware){if(!Array.isArray(middleware))thrownewTypeError('Middlewarestackmustbe一个数组!')for(constfnofmiddleware){if(typeoffn!=='function')thrownewTypeError('Middlewaremustbecomposedoffunctions!')}/***@param{Object}context*@return{Promise}*@apipublic*/returnfunction(context,next){//最后调用的中间件#letindex=-1returndispatch(0)functiondispatch(i){if(i<=index)returnPromise.reject(newError('next()被多次调用'))index=iletfn=middleware[i]if(i===middleware.length)fn=nextif(!fn)返回Promise.resolve()try{returnPromise.resolve(fn(context,functionnext(){returndispatch(i+1)}))}catch(err){returnPromise.reject(err)}}}}by从上面可以看出,Express中中间件的next参数是一个普通的函数对象,而Koa中中间件的next参数是一个promise对象。所以当我们挂载异步中间件时,Express不能像Koa那样在中间件中使用await。等待下一个中间件执行完成,再执行当前中间件的后续逻辑。这就是“Express是线性模型,Koa是洋葱模型”的根本原因。