首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >nodejs http://localhost:3000/socket.io/socket.io.js 404 (未找到)-如何配置Socket.io - socket.IO、apache2、websockets

nodejs http://localhost:3000/socket.io/socket.io.js 404 (未找到)-如何配置Socket.io - socket.IO、apache2、websockets
EN

Stack Overflow用户
提问于 2018-06-14 05:31:05
回答 1查看 2.2K关注 0票数 2

好的,我再一次遇到了socket.io和express的问题。当我运行我的节点js应用程序时,它在遇到错误“GET http://localhost:3000/socket.io/socket.io.js 404 (Not Found)”和"Uncaught : io is not defined“之前开始构建。这是我第二次使用web套接字,并收到相同的错误。对于之前的应用程序,我在apache服务器上设置了一个反向代理,从而修复了这个问题。它看起来像这样;

代码语言:javascript
复制
ProxyPass /socket.io http://localhost:3000/socket.io

然而,对于当前的nodejs应用程序,这并没有解决这个问题。这两个应用程序之间的主要区别是,当前的应用程序不会开始使用socket.io,直到用户将自己定向到本地主机:3000/轰炸机-孩子-在线游戏页面。当前的应用程序是第一个应用程序的扩展,也就是这个nodejs应用程序提供了一个网站,以及我之前的应用程序,这是一个托管在zEyeland.com/bomber-kids-online上的游戏。

下面是我的js文件,它向浏览器发送要加载的适当的html文件:

代码语言:javascript
复制
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var express = require('express');
var router = express.Router();

var updatedMAP;
var updatedOBJECTS;

router.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
  console.log("a user connected");

  socket.on('sendNoramlBomb', function(xPosition, yPosition, power){

  socket.broadcast.emit('sendNoramlBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendRedBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendRedBomb', xPosition, yPosition, power);
});
  socket.on('sendBlueBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendBlueBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendGreyBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendGreyBomb', xPosition, yPosition, 
power);
  });
  socket.on('sendGreenBomb', function(xPosition, yPosition, power){

    socket.broadcast.emit('sendGreenBomb', xPosition, yPosition, 
power);
  });

  socket.on('sendPlayer', function(locationY, locationX, direction){


    io.emit('sendPlayer',locationY, locationX, direction);
  });

  socket.on('chat message', function(msg){
   io.emit('chat message', msg);
 });

 socket.on('disconnect', function(){
   console.log("user disconnected");
     });
   });

//http.listen(3000, function(){
// console.log('listening on *:3000');
//});

module.exports = router;

这是我当前项目的apache配置

代码语言:javascript
复制
    ProxyPass        /socket.io http://localhost:3000/bomber-kids-online/socket.io
    ProxyPassReverse /socket.io http://localhost:3000/bomber-kids-online/socket.io


    <Proxy *>
        Order deny,allow
    Allow from all 
    </Proxy>    
ProxyRequests Off
ProxyPreserveHost On

ProxyPass    / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/

所以重述一下正在发生的事情。我正在尝试运行一个使用websockets的nodejs游戏。当访问我的游戏在网站上的本地主机:3000/轰炸机-孩子-在线它得到一个( get http://localhost:3000/socket.io/socket.io.js 404 (未找到))我如何解决这个问题?我的反向代理这次似乎无法修复它。你可以在zeyeland.com/bomber can online上查看我的游戏的工作版本。我当前的项目使用完全相同的html和javascript文件来运行。但是,通过检查上面我的reverseProxy,您会注意到,在我当前的项目中,游戏不是直接从localhost:3000访问的,而是从服务器上的另一个js文件提供的路由访问的。

下面是我的应用程序第一个js文件的样子;

代码语言:javascript
复制
 var createError = require('http-errors');
 var express = require('express');
 var path = require('path');
 var cookieParser = require('cookie-parser');
 var logger = require('morgan');

 var indexRouter = require('./routes/index');
 var usersRouter = require('./routes/users');
 var bomberKidsRouter = require('./routes/games/bomber-kids-online- 
game');

 var app = express();

 // view engine setup
 app.set('views', path.join(__dirname, 'views'));
 app.set('view engine', 'pug');

 app.use(logger('dev'));
 app.use(express.json());
 app.use(express.urlencoded({ extended: false }));
 app.use(cookieParser());
 app.use(express.static(path.join(__dirname, 'public')));

 app.use('/', indexRouter);
 app.use('/users', usersRouter);
 app.use('/bomber-kids-online', bomberKidsRouter);

 // catch 404 and forward to error handler
 app.use(function(req, res, next) {
 next(createError(404));
 });

 // error handler
 app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
 res.status(err.status || 500);
res.render('error');
 });

 module.exports = app;
EN

回答 1

Stack Overflow用户

发布于 2021-03-17 05:37:57

我遇到了同样的问题,并遵循了@Marcos建议的这些步骤,但在我的情况下不起作用,所以我删除了所有的socket.io、socketio和express包,并按如下方式重新安装

代码语言:javascript
复制
npm i express --save
npm i socket.io@2.4.1 --save

并确保它们已经更新,就像之前Ubunto下载2.1版本的socket.io一样,它有一些漏洞问题,然后我没有使用'require‘格式,而是使用了'import’,如下所示

代码语言:javascript
复制
import express from 'express';
import http from 'http';
import createGame from './public/game.js';
import socketio from 'socket.io';

const app = express();
const server = http.createServer(app);
const sockets = socketio(server);

它终于成功了。在苦苦挣扎了一整天之后,我想如果将来有人遇到类似的问题,这将是很有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50846572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档