相关疑难解决方法(0)

在请求体中解析UTF8字符的问题?

在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

6
推荐指数
1
解决办法
5775
查看次数

如何防止Node.js将套接字消息拆分成更小的块

我有一个聊天程序,通过TCP套接字将JSON数据从Apache/PHP推送到Node.js:

// Node.js (Javascript)
phpListener = net.createServer(function(stream)
{
    stream.setEncoding("utf8");
    stream.on("data", function(txt)
    {
        var json = JSON.parse(txt);

        // do stuff with json
    }
}
phpListener.listen("8887", 'localhost');

// Apache (PHP)
$sock = stream_socket_client("tcp://localhost:8887");
$written = fwrite($sock, $json_string);
fclose($sock);
Run Code Online (Sandbox Code Playgroud)

问题是,如果JSON字符串足够大(大约8k),输出消息将被拆分为多个块,并且JSON解析器失败.PHP返回$ written值作为字符串的正确长度,但数据事件处理程序触发两次或更多次.

我是否应该将该函数附加到另一个事件,或者是否有办法在事件触发期间缓存文本,这种方式不会在重负载下屈服于竞争条件?或者其他一些我没有想过的解决方案?

谢谢!

php sockets apache stream node.js

5
推荐指数
1
解决办法
2875
查看次数

标签 统计

node.js ×2

apache ×1

php ×1

sockets ×1

stream ×1