Socket.io / Node.js : «значение выходит за рамки» при подключении сокета от клиента

#node.js #socket.io #arm #base64 #engine.io

#node.js #socket.io #arm #base64 #engine.io

Вопрос:

Я работаю над получением nodejs / socket.io / экспресс, работающий в busybox linux на процессоре ARMv5TE. У меня запущен и запущен 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'); . Затем узел регистрирует эту ошибку на консоли и останавливается:

 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)
  

Запуск того же сервера узла с моего настольного компьютера (64-разрядная версия Windows 8) не приводит к этой ошибке.

Я могу отследить ошибку до этих строк кода в 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 безопасным или уместным?

Комментарии:

1. Вы пробовали обернуть этот объект в JSON.stringify, чтобы у вас был JSON.stringify({ hello: ‘world’ }) ?

2. Я все еще получаю ту же ошибку. Этот код извлекается прямо из socket.io примеры: socket.io/docs

3. Я скопировал вставку, и это сработало для меня? конечно, порты и IP-адрес пришлось изменить, но на самом деле это было так.

4. Вы запускали его с node на процессоре ARMv5TE? Этот же код отлично работает для меня, когда я запускаю его с node и на своем компьютере с Windows. Я думаю, что это проблема с узлом конкретно на ARMv5TE.

5. Это имеет большой смысл, это звучит как сокет. собственный материал ввода-вывода вызывает проблемы, в частности, это могут быть вещи в зависимости от ws. Может быть, попробуйте выполнить базовый пример с модулем ws для проверки? также может быть какой-то волшебный флаг для node-gyp, который вы могли бы добавить, чтобы изменить способ компиляции. Я думаю, что это сводится к специфичному для платформы размеру определенных типов в коде C , но опять же, это может быть намного проще.