function checkUser(req, res, callback){ var chunks = []; var length = 0; var rows = null;
req.on(‘data’, function(data){ chunks.push(data); //1.在get请求中有name和password,这个data是分别取得name和password的字符串? length += data.length; })
req.on(‘end’, function(){
var rows = new Buffer(length);//2.rows是用来干嘛的?
var len = 0;
for (var i = 0, j = chunks.length; i < j; i++) {
chunks[i].copy(rows, len);//3.这个是为了新开Buffer内存空间是吧?有什么作用
len += chunks[i].length;//4.这个是要得到所有的data的长度吗?
}
var args = querystring.parse(rows.toString());
if (args && args.name === ‘june’ && args.password ===‘6502’) {
res.setHeader(‘Set-Cookie’, [‘cookie1987=’ + cookieValue]);
callback(null, true);
} else {
callback(null, false);
}
})
}
- 这个 data 是 request body 的片段,至于按哪个索引分片,这个就是随机的了。http 在接收数据的过程中,每次有 data 事件都会伴随一个这样的片段数据。这些片段只有在全部获得之后,组合起来才有意义。
- rows 只是一段定长的 buffer 内存,rows 这个变量名取得容易让人误解。
- 内存空间已经开好了。这个操作只是把 chunks 里面的东西全都装进 rows 中。如果 chunks 里面的数据都是 ascii 字符的话,其实是可以直接字符串相加的。但是由于数据中不全是 ascii 字符,直接相加 buffer 容易造成 utf-8 字符在被隐式转换成 string 时被截断从而导致无意义数据产生。所以这里先把数据全部放进 chunks 中,再通过 buffer 的实例方法迭代取出并放进连续的 buffer 内存中。
- 这个 len 变量是多余的。相等于之前第三行定义的 length。我看代码后来也没用这变量嘛。
总得来说,
- 如果想手动处理收到的 buffer,请使用 https://github.com/JacksonTian/bufferhelper 。比这个示例中的手动操作方便。
- 最好不要使用裸的 http 库,而是使用 connect 框架,或是更友好一点的 express 框架。这段代码的大部分时间都用在拼接 buffer 上了,这个流程可以抽象出来。
- 解析 querystring 推荐使用 tj 的 qs 库,而非原生的 querystring。https://github.com/tj/node-querystring。如果需要解析非 utf-8 编码的 querystring,比如 gbk 编码或 gb18030 时,可以使用这个:https://github.com/alsotang/urlencode