介绍本文主要对connect-history-api-fallback库进行源码分析。connect-history-api-fallback是一个支持SPA历史路由模式的nodejs库。在阅读本文之前,你应该对HTML5History模式有一定的了解!源码分析/***前端需要开启history模式,但是后端根据url不知道前端请求的是api还是页面,比如localhost:4200/home,前端理所当然地认为“我需要获取html,并跳转到首页”,但后端无法区分。*因此需要一个判断机制,让后端能够分析前端的请求目的。*connect-history-api-fallback这个中间件正好帮我们完成了上面的分析操作,我们来看看它是如何实现的!*第一次把自己的源码分析思路写出来,如有错误请指出!*/'usestrict';varurl=require('url');exports=module.exports=functionhistoryApiFallback(options){//接收配置参数options=options||{};//初始化日志管理器varlogger=getLogger(options);//中间件是返回一个函数,函数参数为req,res,nextreturnfunction(req,res,next){varheaders=req.headers;if(req.method!=='GET'){//如果请求方法不是GET类型,则表示不需要返回html,则调用next(),将请求传递给下一个中间件logger('不重写',req.method,req.url,'因为方法不是GET。');返回下一个();}elseif(!headers||typeofheaders.accept!=='string'){//如果没有请求头,或者请求头中accept不是字符串,说明不是标准的http请求,并且不会被处理,请求会交给下一个中间件logger('Notrewriting',req.method,req.url,'becausetheclientdidsendanHTTPacceptheader.');返回下一个();}elseif(headers.accept.indexOf('application/json')===0){//如果客户端要得到的是application/json类型的response,说明不是在请求html,不做处理,把请求交给到下一个中??间件记录器('不重写',req.method,req.url,'因为客户端更喜欢JSON。');返回下一个();}elseif(!acceptsHtml(headers.accept,options)){//如果请求头不包含配置的Accept或者默认的['text/html','*/*'],那么说明html是未请求,则不处理,将请求交给下一个中间件logger('不重写',req.method,req.url,'因为客户端不接受HTML。');返回下一个();}//来这里说明你请求的是HTML,准备开始show操作//首先使用url模块的parse方法解析url,会得到一个对象,包括protocol,hash,path,pathname,query,search等字段,类似浏览器的location对象varparsedUrl=url.parse(req.url);变种重写目标;//然后获取配置重写,即重定向配置;//重定向配置是一个数组,每一项包含from和to两个属性;//from用于正则匹配pathname是否需要重定向;//to是重定向的url,to可以是字符串,也可以是回调方法返回字符串,回调函数接收一个context参数context,context包含三个属性(parsedUrl、match、request)options.rewrites=opt离子.重写||[];//遍历一波重定向配置for(vari=0;i
