簡體   English   中英

Socket.io + NodeJS不適用於Heroku

[英]Socket.io + NodeJS doesn't work on Heroku

我正在做一個API,它在Heroku上。 但是我在socket.io上遇到一些問題只在heroku端,當我在本地測試一切都很順利。 API完全獨立於前端,因此它們位於不同的域(和不同的主機)。 問題是在生產中,我沒有成功連接套接字......

我有一些問題,所有這些都是關於heroku上的socket.io配置。 我知道有一些帖子提供了一些相關的信息,但我發現它的帖子是舊版本的sockets.io或舊版本的heroku(heroku似乎已經改變了過去七月的websockets內容):

  • 我不知道在heroku上運行socket.io之前是否需要激活一些東西。 我讀了一些關於它的帖子,但似乎都很老了......我試着激活Websockets: $ heroku labs:enable websockets但我得到的響應是: ! No such feature: websockets ! No such feature: websockets

  • 我是否必須指定一個端口,或Heroku有一個自動端口?

  • 我需要兩個連接嗎? 一個是監聽POST / GET / PUT / DELETE而另一個是監聽套接字?

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);
    ...

插座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;
    };
}

我再說一遍,一切都在localhost上運行。 我嘗試了localhost:5000上的API和localhost:80上的客戶端應用程序,並且所有套接字都正常工作。

謝謝。

所以這里有幾件事。 如果您想使用Heroku的Websocket服務(實際上非​​常棒),您將需要重新編寫代碼以使用websockets的einaros / ws實現 - 然后通過heroku命令行添加服務。 https://github.com/einaros/ws/blob/master/doc/ws.md

但是 ,既然你已經將你的應用程序編碼為socket.io,我只會修改你如何實例化socket.io庫:

var express = require('express'),
    app = express(),
    server = require('http').createServer(app),
    io = require('socket.io').listen(server),

server.listen(process.env.PORT || 3000);

這應該可以解決您的問題,但請告訴我日志顯示的內容。 我認為掛斷的是你的應用程序和你的套接字在兩個不同的端口上運行。

在創建服務器之后,您可以使用以下方法偵聽套接字事件:

io.sockets.on('connection', function(socket) { //'connection' or any other event

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM