socket.io没有在heroku上工作

时间:2012-04-14 18:54:55

标签: node.js heroku

每当我尝试在heroku上使用require("socket.io");时,它都会失败并显示消息“找不到模块socket.io”。

我认为这是我的设置问题,因为我的本地node.js服务器运行正常。

我需要改变什么?

6 个答案:

答案 0 :(得分:6)

雪松上的Heroku不支持websockets

无论如何,你可以使用socket.io和

io.set("transports", ["xhr-polling"]); 
io.set("polling duration", 10); 

https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku

答案 1 :(得分:1)

您必须更改PaaS提供商。 Heroku不支持websockets。其中nodejitsu以支持websockets而闻名。

另外,您可能忘记在package.json依赖项列表中添加socket.io

答案 2 :(得分:1)

package.json修改为

"dependencies": {
"async":     "0.1.18",
"ejs":       "0.4.3",
"express":   "2.4.6",
"faceplate": "0.0.4",
"socket.io": "latest"   },

服务器端代码是:

var port=process.env.PORT || 3000;
var http=require('http');
var app=http.createServer(function(req,res){
    res.write("server listening to port:"+port);
    res.end();
}).listen(port);
socket=require("socket.io");
io=socket.listen(app);
io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10); 
});
io.sockets.on("connection",function(socket){
    console.log("new connection");
    socket.on("eventA",function(data){
        io.sockets.emit("eventB",data);
    }); 
});

像魅力一样工作!!!

答案 3 :(得分:0)

根据this project wiki page,您需要将socket.IO上的传输选项更改为xhr-polling,持续时间为(10)秒。

答案 4 :(得分:0)

websocket transport正在测试处于测试状态的Heroku。您可以使用heroku labs:enable websockets -a YOUR_APP_NAME

启用它

答案 5 :(得分:0)

<块引用>

这些是socket.io相关问题的解决方案

<块引用>

我希望我能工作

  1. 您的(index.js 或 server.js)和(index.html 和您的 client.js)端口中的端口必须不同。 (参考下面的代码)
<块引用>

============您的 index.js 文件 ========================

<块引用>

(这里的端口是 8000)

const express = require("express")
var app = express();
const http = require('http')
var server = http.createServer(app);
  
const port = process.env.PORT || 8000
server.listen(port,()=>
{
    console.log("Listening at port => "+port)
});
var io = require('socket.io')(server, {
    cors: {
      origin: '*',
    }
});

const cors = require("cors")
app.use(cors()) 
<块引用>

============您的 client.js 文件 ======================

<块引用>

这里的端口是 8080

const socket = io.connect('https://localhost:8080/')
<块引用>

============您的 index.html 文件 ======================

<块引用>

这里的端口是 8080

 <script defer src="https://localhost:8080/socket.io/socket.io.js"> 
 </script>
<块引用>

记住你的“server.js or index.js”端口应该和“client.js”端口不同(记住这很重要)

<块引用>

(index.html 和你的 client.js) 端口必须相同

  1. 在使用 socket.io 时,您应该始终使用“http”(请参阅​​上面的代码)

  2. 你可能不包括 cors 因为它允许你有更多的资源,没有 cors heroku 防止某些依赖项无法安装在 heroku 中(参考上面的代码)

  3. 尝试将“io”替换为“io.connect”

    const socket = io.connect('https://localhost:8080/')

  4. 必须在 HTML 的末尾写标签

  5. 你可能忘记在“socket.io”中添加这个必须的代码

在您的 html 文件中是必需的

  1. 删除“node_modules”和“package-lock.json” 并在 cmd 中写入“npm i”

  2. 这应该在 package.json 的脚本中

    "start":"node index.js",

我不是在谈论 nodemon ,在这里使用简单的 node

  1. 可能是版本造成了问题,您可以通过将所有“devDependencies”复制到“package.json”中的“dependencies”并像这样在版本中放置“*”来避免它

    “依赖项”:{

    "cors": "*",

    "express": "*",

    "nodemon": "*",

    "socket.io": "*"

    },

    “devDependencies”:{}