在node.js中实现HTTP服务时,有很多示例代码如下所示用于获取整个请求实体(客户端上传的数据,例如带有JSON数据的POST):
var http = require('http');
var server = http.createServer(function(req, res) {
var data = '';
req.setEncoding('utf8');
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
// parse data
});
});
Run Code Online (Sandbox Code Playgroud)
req.setEncoding('utf8')假设输入是UTF8编码的,使用自动将输入字节解码为字符串.但我觉得它可以打破.如果我们收到一个以多字节UTF8字符结尾的数据块怎么办?我们可以模拟这个:
> new Buffer("café")
<Buffer 63 61 66 c3 a9>
> new Buffer("café").slice(0,4)
<Buffer 63 61 66 c3>
> new Buffer("café").slice(0,4).toString('utf8')
'caf?'
Run Code Online (Sandbox Code Playgroud)
所以我们得到一个错误的字符,而不是等待下一个字节正确解码最后一个字符.
因此,除非请求对象处理这个问题,确保只将完全解码的字符推入块中,否则这个无处不在的代码示例将被破坏.
另一种方法是使用缓冲区,处理缓冲区大小限制的问题:
var http = require('http');
var MAX_REQUEST_BODY_SIZE = 16 * 1024 * 1024;
var server = http.createServer(function(req, res) {
// A better …Run Code Online (Sandbox Code Playgroud) node.js ×1