我正在努力让 nodejs / socket.io / express 在 ARMv5TE 处理器上的 busybox linux 上运行。我已经启动并运行了 nodejs,并且以下代码运行没有错误。
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
直到我尝试从客户端通过 websocket 连接。从浏览器(socket.io.js
加载了客户端脚本),var socket = io.connect('ws://192.168.1.8:3000');
或var socket = io.connect('http://192.168.1.8:3000');
. 然后 Node 将此错误记录到控制台并停止:
buffer.js:784
throw TypeError('value is out of bounds');
TypeError: value is out of bounds
at TypeError (<anonymous>)
at checkInt (buffer.js:784:11)
at Buffer.writeInt32BE (buffer.js:924:5)
at Base64Id.generateId (/usr/lib/node_modules/socket.io/node_modules/engine.io/node_modules/base64id/lib/base64id.js:88:8)
at Server.handshake (/usr/lib/node_modules/socket.io/node_modules/engine.io/lib/server.js:222:21)
at /usr/lib/node_modules/socket.io/node_modules/engine.io/lib/server.js:184:12
at Server.checkRequest (/usr/lib/node_modules/socket.io/lib/index.js:67:51)
at Server.verify (/usr/lib/node_modules/socket.io/node_modules/engine.io/lib/server.js:127:17)
at Server.handleRequest (/usr/lib/node_modules/socket.io/node_modules/engine.io/lib/server.js:174:8)
at Server.<anonymous> (/usr/lib/node_modules/socket.io/node_modules/engine.io/lib/server.js:362:12)
从我的台式计算机(Windows 8 64 位)运行相同的节点服务器,不会产生此错误。
我可以将错误追溯到以下代码行node_modules/socket.io/node_modules/engine.io/node_modules/base64id/lib/base64id.js
:
Base64Id.prototype.generateId = function () {
var rand = new Buffer(15); // multiple of 3 for base64
if (!rand.writeInt32BE) {
return Math.abs(Math.random() * Math.random() * Date.now() | 0).toString() + Math.abs(Math.random() * Math.random() * Date.now() | 0).toString();
}
this.sequenceNumber = (this.sequenceNumber + 1) | 0;
rand.writeInt32BE(this.sequenceNumber, 11);
...
如果我更改rand.writeInt32BE(this.sequenceNumber, 11);
为rand.writeInt32BE(this.sequenceNumber, 11, true);
,错误就会消失,我可以继续没有问题(大概)。所以:
- 为什么在 ARMv5TE 机器上运行我的代码时会出现此错误?
- 我的更改是
base64id.js
安全的还是适当的?