Node Express的中间件以及对静态文件进行处理


随着工作经验的增多,通过别人的文档来获得帮助已经逐渐不能满足我们的工作需求(往往是文档写的有延迟,而且不会更新)。这时候,就需要通过查看项目最新的代码来保证我们工作的顺利进行。正如德雷福斯模型所说,一个新手向高级新手进发的旅途上要学会不断思考与学习。要这篇文章就是在这种状态下诞生的。

背景:

Express是当前在Nodejs上非常火的一个轻量级框架。在Express当中,通过使用app.use来添加中间件,所谓中间件(Middleware),可以理解为一个对用户请求进行过滤和预处理的东西,它一般不会直接对客户端进行响应,而是将处理之后的结果传递下去。在Express中,分为两种中间件,一种是内置中间件,一种是第三方中间件,如express中对静态文件的处理就调用了它的内部中间件static:

app.use('/public',express.static(__dirname + '/public'));

可以看到,在express中,是通过app.use来调用中间件的。

在Express中,app.use把中间件加入一个栈中,http request将触发整个中间件链条,并依次执行(通过 next() 函数实现),功能类似于filter,但其作用却大于filter,它可以动态地给req,res添加内容。更多express的内容请参见:《Node.js[5] connect & express简介》。

 

具体操作:

闲话少叙,Express中对静态文件的处理使用了express.static——对所有正常的静态文件都直接输出到浏览器了。但是在工作中我们有时对静态文件进行一些处理,例如:express对静态html的header编码默认为UTF-8, 但是部分路径下的html为GBK,这时候要让express依据路径来设置header头。由于express.static是express中少有的对/pulic路径下的route导向静态资源文件,不调用next。我们不能在其之后添加对静态文件的处理。那么就只有两种实现方式:

     1.自己实现静态文件服务器

     2.对express.static进行改写

对于后者,网上并没有相应的文档,查阅Express文档发现express对静态文件的处理调用了serve-static这个组件,然后查看serve-static的代码,发现1.7.1版本的static提供了setHeaders函数:

项目地址:https://github.com/expressjs/serve-static

setHeaders是一个允许用户自定义设置header的方法,满足我们的需求,大喜之下观察它的源码,发现只要有设置setHeaders,那么就会把setHeaders加入到Steam流中。而我们可以自己编写setHeader来完成自己想要的功能。以下就是具体的实现,完成了对/public/lab/wwwdemo目录下的Html页面的header charset设置为gbk。

app.use(express.static(path.join(__dirname, 'public'),{
    setHeaders:function(res,path,stat) {
        if(res && path.indexOf("/public/lab/wwwdemo")>-1) {
            res.setHeader("Content-type","text/html; charset=gbk");
        }
    }
}));

至此任务完成,尽管是一个小的任务,但是对于理解Express的原理还是有所帮助的。

参考博客: 

2.  express中间件 -- cubika
3.  express4.2源码解析 -- dlutwuwei

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM