我正在使用带有express的socketIO。
在我的项目中,我有一个登录页面和一个主页。 当我成功登录时,我导航到localhost:3000 / home,我收到此错误:
GET http://localhost:3000/socket.io/?EIO=3&transport=polling&t=1418187395022-0 404 (Not Found)
我没有在app.js中进行任何修改(由express创建的项目)。
Index.js:
var express = require('express');
var router = express.Router();
var http = require('http');
var fs = require('fs');
var io = require('socket.io')(http);
/* GET home page. */
router.get('/', function(req, res) {
res.render('index', { title: 'Express' });
});
router.get('/home', function(req, res) {
res.render('home', { title: 'Express' });
});
io.on('connection', function(socket){
console.log("User Connected");
socket.on('chat message', function(msg){
io.emit('chat message', msg);
console.log("Message");
});
socket.on('disconnect', function(msg){
console.log("User DisConnected");
});
});
router.post('/authenticate', function(req, res) {
fs.readFile("./public/Verification/Users.json", "utf8", function (err, data) {
if (err)
console.log(err);
else{
var result = JSON.parse(data);
for(var i=0;i<result.Users.length;i++){
if(req.body.username == result.Users[i].username && req.body.password == result.Users[i].password){
console.log("Success!!!!!!!!!!!!!!");
res.location("home");
res.redirect("home");
}
}
}
});
});
module.exports = router;
每当我导航到localhost:3000 / home时,我都会收到此错误。我是socketIO和express的新手。 请告诉我,如果我遗失了什么。
由于
修改:
在我的layout.jade中,我定义了这样的socketio:
script(src='https://cdn.socket.io/socket.io-1.2.0.js')
答案 0 :(得分:61)
如果您正在运行Express 4,我觉得您似乎错过了代码行:
var app = express();
var server = app.listen(3000);
这将启动您的Web服务器并将其设置为端口3000.请在此处查看骨骼简单的Express 4应用程序:http://expressjs.com/4x/api.html
然后,启动socket.io,你会添加:
var io = require('socket.io').listen(server);
并且,没有必要这一行:
var http = require('http');
答案 1 :(得分:29)
因为我在过去5个小时内一直在与这个问题作斗争。这是谷歌的第一个结果。
当然它的2015年和一些代码已经改变了。
我认为目前index.js代码的最佳起点是:
var express = require('express'),
http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(3000);
订单非常重要。
我的问题是,所有内容都已正确安装且节点正在侦听。但是未找到example.com/socket.io/socket.io.js和example.com/socket.io/?eio = ...的404。 但是,当我尝试example.com:3000/socket.io/socket.io.js时一切正常。所以现在问题是如何更改getJSON查询以获得端口部分。
所以解决方案就是编辑main.js,它将被添加到您的聊天所在的index.html。 有:
var socket = io();
替换为
var socket = io.connect('http://example.com:3080');
这会更正getJSON查询URL并添加正确的端口,而不再是404.我希望将来可以帮助某人。
答案 2 :(得分:2)
这是我在服务器端(2018年)解决的方法:
const app = express();
const socketIO = require('socket.io');
const server = express()
.use(app)
.listen(PORT, () => console.log(`Listening Socket on ${ PORT }`));
const io = socketIO(server);
在客户端
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.1/socket.io.js"></script>
这看起来很简单,但是我花了几个小时才找到解决方案,因为上述解决方案对我不起作用。
答案 3 :(得分:1)
请将您的配置更改为此
var express = require('express');
// App setup
var app = express();
var socket = require('socket.io')
var server = app.listen(4000, function(){
console.log('listening for requests on port 4000,');
});
let io = socket(server)
io.on('connection', function(socket){
console.log(`${socket.id} is connected`);
});
答案 4 :(得分:0)
只需调用服务器的侦听器,然后使用回调将服务器实例传递给模块。
快递应用中bin/www
文件的一部分
var server = http.createServer(app);
server.listen(port, function () {
console.log('app listening on *:' + port);
require('../socket')(server);
console.log('socket server will be on *:' + port);
});
server.on('error', onError);
server.on('listening', onListening);
这就是我的套接字模块socket.js
var io = {};
module.exports = (server, serveradmin) => {
io = require('socket.io')(server);
io.on('connection', function (socket) {
console.log(socket + ' a user connected');
});
}
所有套接字侦听器,并从此处发出管理信息。
答案 5 :(得分:0)
对于任何使用nginx代理到node.js的人来说,问题可能出在nginx conf而不是node.js代码上。
您可以使用GET请求(使用curl,Postman或浏览器)对http://localhost/socket.io/(带有斜杠)和一个对http://localhost:3000/socket.io/进行测试
如果http://localhost/socket.io/给出404找不到或“无法获取/”,但是http://localhost:3000/socket.io/返回如下响应:
{"code":0,"message":"Transport unknown"}
然后,后端node.js和socket.io正常运行,但是nginx没有正确传递请求。
检查它应类似于:
location /socket.io/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3000;
}
请特别注意,proxy_pass http://127.0.0.1:3000
的末尾没有斜杠,因为我们希望按原样传递原始请求URI(即,包括/socket.io)。
如果使用URI指定了proxy_pass指令,则当 请求传递到服务器,这是规范化请求URI的一部分 匹配位置的位置将替换为伪指令中指定的URI:
location /name/ { proxy_pass http://127.0.0.1/remote/; }
如果指定了不带URI的proxy_pass,则请求URI将以相同的方式传递到服务器 客户处理原始请求时发送的表格,或者 处理更改的URI时,将传递完整的规范化请求URI:
location /some/path/ { proxy_pass http://127.0.0.1; }
https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/涵盖了标头要求(基本上,websocket需要升级标头,而升级标头需要HTTP / 1.1)