每当我尝试在heroku上使用require("socket.io");
时,它都会失败并显示消息“找不到模块socket.io”。
我认为这是我的设置问题,因为我的本地node.js服务器运行正常。
我需要改变什么?
答案 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相关问题的解决方案
<块引用>我希望我能工作
============您的 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) 端口必须相同
在使用 socket.io 时,您应该始终使用“http”(请参阅上面的代码)
你可能不包括 cors 因为它允许你有更多的资源,没有 cors heroku 防止某些依赖项无法安装在 heroku 中(参考上面的代码)
尝试将“io”替换为“io.connect”
const socket = io.connect('https://localhost:8080/')
必须在 HTML 的末尾写标签
你可能忘记在“socket.io”中添加这个必须的代码
在您的 html 文件中是必需的
删除“node_modules”和“package-lock.json” 并在 cmd 中写入“npm i”
这应该在 package.json 的脚本中
"start":"node index.js",
我不是在谈论 nodemon ,在这里使用简单的 node
可能是版本造成了问题,您可以通过将所有“devDependencies”复制到“package.json”中的“dependencies”并像这样在版本中放置“*”来避免它
“依赖项”:{
"cors": "*",
"express": "*",
"nodemon": "*",
"socket.io": "*"
},
“devDependencies”:{}