2016-02-03 4 views
2

Я потратил немало времени, пытаясь подключить Socket.IO-Client к серверу, работающему на Sails.js framework. Клиент в основном представляет собой простое приложение JavaScript, работающее с Node.js на малине Pi.Как подключить Socket.IO-Client к серверу Sails.js?

Идея состоит в том, что простое устройство подключается к серверу, затем сервер регистрирует устройство и подписывает его на сообщения. Устройство получает сообщение от сервера и выполняет некоторые действия. Я не хочу, чтобы клиент зависел от какой-либо структуры, и по этой причине я стараюсь избегать использования Sailsjs-socket.io-client. В настоящий момент оба сервера и клиент работают на моем локальном компьютере. Вот код:

// Server side. Sails.js. DevicesController.js 
 

 
module.exports = { 
 

 
    handshake: function (req, res) { 
 
    if (!req.isSocket) return res.badRequest(); 
 
    Devices.create({}).exec(function (error, data) { 
 
     Devices.subscribe(req.socket, data); 
 
    }); 
 
    return res.ok(); 
 
    } 
 

 
}; 
 

 

 
// Client side 
 
var socket = require('socket.io-client')('http://localhost:1337/devices/handshake'); 
 

 
socket.on('error', function(e) { 
 
    console.log(e); 
 
    // Here I get 'Invalid namespace' 
 
});

Таким образом, я получаю ошибку «Invalid имен» на стороне клиента, и, если я прав, то это означает, что сервер не имеет "/устройства/рукопожатие ". Однако на стороне сервера, если я перечисляю существующие идентификаторы комнат (sails.sockets.rooms()), я вижу, что новая комната всегда создается, когда клиент пытается подключиться к серверу.

Я попытался подключиться к «устройствам/рукопожатию» из браузера с приведенным ниже javascript и, по-видимому, сработал. Очевидно, он работает с Sailsjs-socket.io-клиентом.

io.socket.get('/devices/handshake', function (data, jwres) { 
 
    console.log(jwres); 
 
}); 
 
io.socket.on('devices', function (data, jwres) { 
 
    console.log(data); 
 
});

Любые идеи, что я делаю не так?

ответ

5

Кажется, вы вводите в заблуждение несколько концепций здесь: пространства имен Socket.io, пути Socket.io и маршруты Sails. Вы можете узнать немного больше о первых двух, просмотрев Socket.io docs. Главное, чтобы иметь в виду, что касается Sails, заключается в том, что только прослушивает соединения по умолчанию по умолчанию / namespace; Таким образом, вы должны всегда Подключение на стороне клиента розетки с:

var socket = require('socket.io-client')('http://localhost:1337'); 

Добавление /devices/handshake на конец не изменяет URL, что сокет пытается подключиться к; он всегда будет пытаться подключиться к http://localhost:1337/socket.io. Вместо этого это означает, что он попытается зарегистрировать сокет с пространством имен /devices/handshake, которое Sails не предоставляет.

С другой стороны, когда вы звоните io.socket.get('/devices/handshake'), вы используете библиотеку Sails сокет клиента, чтобы сделать виртуальный запрос на этот маршрут в приложении, так же, как если бы вы использовали AJAX (например, $.get('/devices/handshake') в JQuery). Именно поэтому был создан sails.io.js - это делает это очень просто! Это также не привязывает вас к интерфейсу; все sails.io.js действительно предоставляет некоторые обертки, чтобы упростить общение с бэкэндами Sails через сокеты. Под обложками io.socket.get просто использует метод Socket.io-client .emit() для отправки события get на сервер с полезной нагрузкой, описывающей URL-адрес и параметры выполняемого действия Sails.Итак, это:

io.socket.get('/devices/handshake', function(body, res){...}) 

эквивалентно подключения собственного сокета и делают это:

socket.emit('get', {url: '/devices/handshake'}, function(res){...}) 

Рекомендуемый подход для запуска логики для сокета, когда он первый подключается, чтобы позволить гнездо полностью подключить на клиенте, а затем сделать запрос от клиента на сервер (именно то, что вы делаете в своем втором блоке кода). Чтобы узнать больше о причинах этого, см. this note in the Sails 0.11.x migration guide. В этой записке также объясняет, что если вы должны немедленно запустить логику при подключении сервера для какой-либо причины, вы можете сделать

sails.io.on('connect', function (newlyConnectedSocket){}) 

в функции начальной загрузки (config/bootstrap.js).

+0

Hey sgress454, я борюсь с аналогичной проблемой, но использую клиентский сокету Python [См. МОЙ ВОПРОС] (http://stackoverflow.com/questions/40949932/how-to-connect-to-sails-socket- ИО-сервер из-а-питон-клиент испытанного-sailssock). У вас есть какие-то дальнейшие указания? – zabumba

Смежные вопросы