Socket.io + NodeJS ne fonctionne pas sur Heroku
Je suis en train de faire une API et c'est sur Heroku. Mais je vais avoir quelques problèmes avec le socket.io uniquement sur le heroku côté, quand je l'ai tester en local tout va bien. L'API est complètement indépendant de l'interface, ainsi ils sont dans des domaines différents (et un des hôtes différents). Le problème est que sur la production, je n'ai pas réussir à se connecter les prises...
J'ai quelques questions, tout de qui sont sur le support.io configuration sur heroku. Je sais qu'il y a certains postes avec quelques informations à ce sujet, mais les messages j'ai trouvé que c'était avec les anciennes versions de sockets.io ou les anciennes versions de heroku (heroku semble qu'il a changé les websockets des choses du passé juillet):
-
Je ne sais pas si je dois activer quelque chose avant de lancer la socket.io sur heroku. J'ai lu quelques posts sur le sujet, mais tout semble être vieux... j'ai essayé d'activer les Websockets avec:
$ heroku labs:enable websockets
mais la réponse que j'ai reçu était:! No such feature: websockets
. -
Dois-je spécifier un port, ou Heroku dispose d'un dispositif de port pour qui?
-
Faire j'ai besoin de deux connexions? Un pour écouter la POST/GET/PUT/DELETE et un autre pour les sockets?
app.js
var express = require('express');
var app = module.exports = express();
var port = process.env.PORT || 5000;
var port_s = 3000;
var server = require('http').createServer(express);
...
app.listen(port);
server.listen(port_s);
require('./config/socket-io')(app, server, secret);
app.post('/user', routes.users.register);
...
socket-io.js
module.exports = function(app, server, secret) {
var clients = {};
console.log("initiating sockets...");
var sio = require('socket.io').listen(server);
sio.sockets.on('connection', function (socket) {
clients[socket.id] = socket;
console.log("...new connection: "+socket.client.id);
socket.emit('identification', { data : socket.client.id });
socket.on('newShoutOut', function(data) {
var receptor = data.idTo;
var emiter = socket.client.id;
//console.log("...new shout out from " +emiter+ " to "+receptor);
var elem = findElement(sio.sockets['sockets'], 'id', receptor);
sio.sockets.sockets[elem].emit('privateShoutout',{ data : data.data, from : emiter });
});
socket.on('disconnect', function() {
//console.log("..."+socket.client.id + " disconnected");
});
});
};
function findElement(arr, propName, propValue) {
for (var i=0; i < arr.length; i++) {
if (arr[i].id === propValue)
return i;
};
}
Je le répète, tout fonctionne sur localhost. J'ai essayé de l'API sur localhost:5000 et l'application cliente sur localhost:80 et toutes les prises, beau travail.
Merci.
heroku logs
et laissez-moi savoir ce que vous voyez?
OriginalL'auteur newpatriks | 2014-07-29
Vous devez vous connecter pour publier un commentaire.
Donc, il ya un couple de choses ici. Si vous souhaitez utiliser Heroku du Websocket service (ce qui est assez génial, en fait), vous allez avoir besoin de retravailler votre code pour utiliser la einaros/ws mise en œuvre des websockets--puis ajouter le service via heroku ligne de commande. https://github.com/einaros/ws/blob/master/doc/ws.md
cependant, puisque vous avez déjà codé votre application à douille.oi, je voudrais simplement retravailler la façon dont vous êtes l'instanciation de la socket.io bibliothèque:
Cela devrait résoudre votre problème, mais laissez-moi savoir ce que les journaux. Je pense que le raccrocher, c'est que votre application et votre douille sont en cours d'exécution sur deux ports différents.
Fois que vous avez créé votre serveur, vous pouvez écouter pour socket événements avec:
Espère que cette aide.
Non, vous n'avez pas besoin de spécifier d'autres ports. Le GET/POST ne sera pas interférer avec votre prise écouteurs d'événement.
juste par curiosité, si vous avez exécuté
heroku logs
à partir de la ligne de commande, avec votre précédent de mise en œuvre, quelles sont les erreurs?aw désolé. Il n'y a pas d'erreur. J'ai été spécifiant un port et Heroku ignoré tout le code après
require('socket.io').listen(server);
.OriginalL'auteur bencripps