对于前端开发来说,web应用我们并不陌生。今天想要讨论一下,在开发一个web应用的时候,我们需要一些基本的知识储备。我们知道,一个web应用脱离不了(request)请求和响应(response),我们所有想要的的东西,想做的事情都脱离不了它们。那么我们具体需要关注那些知识点呢?在nodejs中,又是怎么实现和运用的呢?下面我们详细了解一下。
1.请求方法
使用浏览器访问任意一个网站,抓包查看网络请求,都会在request header报文中发现这么一行
GET / HTTP/1.1 //访问http://www.so.com的结果 //第一个是请求方法;第二个是访问路径;第三个是HTTP版本号
第一个值就是我们这里要说的请求方法,我们可以通过监听node服务的链接,来响应用户的请求。
function(req, res) { //使用req.method接收不同类型的请求,并做相应的处理 //method的值有:GET POST PUT CONNECT DELETE }
上面的做法,可以根据请求方法将业务逻辑分发。
2.路径解析
在请求方法中,也讲到请求报文第一行第二部分的值就是该请求的路径。我们node服务器在接收到这个路径请求的时候,会通过两种形式来响应请求。
第一种是静态文件,可以通过路径直接读取文件内容,然后给出响应。
需要注意的是,在nodejs中url模块可以处理url相关的操作。
var url = require('url'); var fs = require('fs'); function(req, res) { var pathname = url.parse(req.url).pathname; fs.readFile(pathname, function(err, file) { if(err) { //返回404 return; } res.end(file); //正常返回 }); }
第二种,就是自己实现一种路由规则,当访问某个地址的时候,根据定义的路由规则读取不同的资源,然后给出相应的响应。
3.查询字符窜
还是在请求报文第一行的第二部分,除了有路径之外,还会存在一些我们需要传递的参数--也就是查询字符串。同样node提供了querystring模块,处理这部分数据。
var url = require('url'); var querystring = require('querystring'); function(req, res) { var query = querystring.parse(url.parse(req.url)).query; //注意查询字符串中的键出现多次,结果是一个数组 }
4.cookie与session
cookie的设置存在两种情况,第一种通过服务端的set-Cookie给浏览器设置cookie,第二种则是浏览器脚本(javascript),两种设置的最终效果是相同的。
关于cookie的基本使用我就不做过多说明了,主要注意一下几点:
- 每次浏览器都会把cookie发送给服务端
- cookie设置了http-only的话,前端不能通过document.cookie进行获取
- cookie设置secure为true时,只能通过https传输
- cookie的安全问题,防止xss和csrf问题出现
cookie本身没有大小限制,他的所有限制来自浏览器和服务器的配置。当然合理的使用cookie才能对页面的性能和安全有保障。
session是为了解决cookie大小和安全性的一种方案,他是服务端生成的,存在于内存中。他也可以使用一些加密算法,让session更加安全的传输。为了解决session的共享问题,我们通常会使用memacha、redis等第三方工具来管理。在nodejs中,本身并没有提供session功能,可以使用session模块来使用。
5.缓存
在B/S模式中的页面,很多情况下不会频繁的更新,这个时候如果每次访问都要请求的话,一方面对资源是一种浪费,另一方面可能花费比较长的时间,随意缓存技术就应运而生啦~
为了提高性能,YSlow有这么几条缓存的规则:
- 添加过期时间
存在的问题:首先这个时间本身存在误差,其次可能我的修改时间变了,但是我的内容没有变化,我的本意是只有在内容发生变化的时候才会重新请求,这种方式的话,就会增加一部分请求。
- 配置Etag
解决的问题:解决过期时间存在的问题,这个值是服务器设置的,在nodejs中,需要自己实现。原理是检测到文件改变才会调整这个的值,反之保持不变。
- 数据缓存
问题:确认一次请求不会改变的数据才做缓存,如果对数据实时性要求比较高的话,就不能使用了,所以使用起来一定要谨慎。
总结说来,之前我们使用的apache、nginx帮我们处理很多,我们不需要关心的配置。而在nodejs中,这些都需要自己实现。
参考资料:
《深入浅出nodejs》--构建web应用