文章目录
NodeJS构建Web应用(一)
基础功能
对于Web应用而言,在具体的业务中,客户端和服务器端发送报文,服务器解析报文分析请求头,我们经常都需要:
- 判断请求方法
- 解析URL的路径
- 解析URL上的查询字符串
- Cookie的解析
- Session(会话)的处理
- Basic认证
- 解析表单数据
- 对任意格式的文件上传处理
请求方法
Web应用中,常见的请求方法是GET和POST,除此之外,还有HEAD、DELETE、PUT、DELETE等方法。
请求方法存在报文的第一行的第一个单词。
GET /path?foo=bar HTTP/1.1
服务器一般只需要处理GET和POST两类请求, 但是在RESTful类Web服务中请求方法决定资源的操作行为。
PUT代表新建一个资源;
POST表示要更改一个新资源;
GET表示查看一个资源;
DELETE表示要删除一个资源。
可以通过请求方法来决定响应行为,如:
function (req, res) {
switch (req.method) {
case 'POST':
update(req, res);
break;
case 'DELETE':
remove(req, res);
break;
case 'PUT':
create(req, res);
break;
case 'GET':
default:
get(req, res);
}
}
路径解析
处理请求有时候需要根据路径来进行处理。
路径一般会存在于报文的第一行第二部分
GET /path?foo=bar HTTP/1.1
HTTP_Parser将报文路径解析为req.url。一般而言,完整的URL地址是如下这样的:
http://user:pass@host.com:8080/p/a/t/h?query=string#hash
客户端代理(浏览器)会将这个地址解析成报文,将路径和查询部分放在报文第一行。需要注意的是,hash部分会被丢弃,不会存在于报文的任何地方。
最常见的根据路径进行业务处理的应用就是静态文件服务器,它会根据路径去查找磁盘中的文件,然后将其响应给客户端,如下:
function (req, res) {
var pathname = url.parse(req.url).pathname;
fs.readFile(path.join(ROOT, pathname), function (err, file) {
if (err) {
res.writeHead(404);
res.end('找不到相关文件。- -');
return;
}
res.writeHead(200);
res.end(file);
});
}
另一种比较常见的分发场景是根据路径来选择控制器,他将路径为控制器和行为的组合,无需额外配置路由信息,如下:
/user(user的控制器)/addage(行为是添加)/10(参数)
后台的会匹配到对应的controller,然后再匹配到对于的控制器行为,剩余值作为参数。
查询字符串
查询字符串位于路径之后,在地址栏中路径后的 “?foo=bar&baz=val” 字符串就是查询字符串。这个字符串会跟随在路径后,形成请求报文首行的第二部分。这部分内容经常需要为业务逻辑所用,Node提供了 “querystring” 模块用于处理这部分数据,如下所示:
var url = require('url');
var querystring = require('querystring');
var query = querystring.parse(url.pa