【问题标题】:NodeJs express.use disturbs the socket.io referenceNodeJs express.use 扰乱了 socket.io 引用
【发布时间】:2015-01-24 15:44:13
【问题描述】:

我是 nodejs 和 socket.io 的新手。 我只是打算检测连接到快速服务器的套接字。 当我不使用快递服务器时,它对我来说工作得很好。 然后出于某种原因,我使用 express 并希望所有内容都是静态的,所以我将此行添加到服务器文件中。

 app.use(express.static(__dirname));

以上行扰乱了我的 client.html 文件。下面是我的 client.html 的代码。我使用开发者控制台调试它,发现包含“/socket.io/socket.io.js”的脚本src无效。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="/socket.io/socket.io.js"></script>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="/css/style.css"/>
<title>Untitled Document</title>

<script>
var socket = io.connect();
socket.on('connect',function(){
    console.log("socket.io working");
});
</script>
</head>
</html>

我认为我缺少一个小概念或东西。我已经尝试了很长时间,但可以找出问题所在。请指导。我自己试试。

更多信息:这是我的应用程序目录结构。


-MyChatRoom

--ChatServer.js

--html
----client.html

--css
----style.css
--images

--node_modules
----socket.io
----express

编辑: 为了更好地理解这里是我的 ChatServer.js 代码

fs = require('fs');  
url = require('url');
express = require('express');
app = express();

server = require('http').createServer(app);
socketio = require('socket.io')(server);

//The root and all subs are made static
app.use(express.static(__dirname));

app.get('/',function(request,response){
    response.sendFile(__dirname + "/html/index.html");
});

app.listen(3000);

var connectedUsers = 0;

socketio.on('connection',function(socket){
    connectedUsers++;
    console.log('client connected');
});

【问题讨论】:

  • 您也可以发布您的 ChatServer.js 代码。还需要查看正在尝试运行的节点。还将您的 html / css 放在公共文件夹中并将其分配给 static 将是一个更好的开始。 app.use(express.static(__dirname + '/public'));
  • 嘿 haxtbh 我已经编辑了问题并添加了 ChatServer.js 代码以方便您使用
  • 请保留 connectedUsers 变量。它不再使用了。
  • 你能不能也试试我上面提到的改变。您现在拥有的静态配置可能会干扰节点模块。
  • 没有解决。客户端错误:加载资源失败:服务器响应状态为 404(未找到)

标签: node.js express socket.io


【解决方案1】:

app.listen(3000);

应该是

server.listen(3000);

你需要监听 http 模块而不是 express 模块。

Express 在实例化时通过 http 模块传递。 Socket.io 使用 http 模块,这就是为什么你需要监听它才能让它工作。

【讨论】:

  • 这个答案有点误导。您可以使用var app = express(); var server = app.listen(3000); 启动您的网络服务器,然后使用var io = require('socket.io').listen(server); 启动socket.io。因此,您根本不必直接使用 http 模块,因为 express 会为您管理。
  • 事实上,你可以看到app.listen() 为你做了什么here。它会为您提供server.listen()
猜你喜欢
  • 2019-05-09
  • 2012-07-02
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
相关资源
最近更新 更多