来自socket.on('data')的数据缓冲区是否可以安全保留?

时间:2018-11-16 14:50:04

标签: node.js sockets

如果我这样做:

const net = require('net');
const allData = [];
const server = net.createServer((socket) => {
    socket.on('data', (data) => {
        allData.push(data); // store data; not a copy of it
    });
});
server.listen(8080, '127.0.0.1');

setInterval(() => {
    console.log(allData);
}, 5000);

我可以保证存储在allData中的数据是一致的吗?还是net可以重新使用缓冲区以存储以后的数据?

使用上面的代码进行测试并发送简单的cURL请求意味着它将不会被覆盖,但是我在documentation中找不到任何东西来支持此功能,而{{ 3}}有点迷宫。

我可以依靠这种行为吗?还是必须复制缓冲区以确保安全?

1 个答案:

答案 0 :(得分:0)

正如Patrick Roberts在评论中指出的,最好的表明这样做是安全的来自Node.js示例,该示例执行了类似的操作。经过一番寻找,我找到了这个示例(对于http而不是net,但它们是紧密联系的);

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

来源:https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

这意味着http数据至少在连接期间是一致的,并且假设这意味着它是无限一致的,这并不是一件容易的事。