Javascript 找不到node.js/socket.io/socket.io.js

Javascript 找不到node.js/socket.io/socket.io.js,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我不断地犯错误 /socket.io/socket.io.js 404(未找到) 未捕获引用错误:未定义io 我的代码是 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); 及

我不断地犯错误 /socket.io/socket.io.js 404(未找到) 未捕获引用错误:未定义io

我的代码是

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);


有什么问题


欢迎任何帮助

如何查找客户端的socket.io.js

安装socket.io

npm install socket.io
查找socket.io客户端

find ./ | grep client | grep socket.io.js
结果:

./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js
将socket.io.js复制到您的资源:

cp ./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js /home/proyects/example/resources/js/
在html中:

<script type="text/javascript" src="resources/js/socket.io.js"></script>

socket.io.js
复制到公用文件夹(比如
resources/js/socket.io.js
)不是正确的方法

如果
Socket.io
服务器正确侦听您的
HTTP
服务器,它将通过
http://localhost:/socket.io/socket.io.js
,您不需要将其作为
resources/js/socket.io.js
&手动提供,也不需要将其复制到可公开访问的文件夹中

代码示例
- Express 3要求您实例化一个
http.Server
以将
socket.io
附加到第一个

var express = require('express')
  , http = require('http');
//make sure you keep this order
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);

//... 

server.listen(8000);

快乐编码:)

这个问题似乎从未被回答过(尽管对于OP来说可能已经太晚了,我会为将来遇到它并需要解决问题的任何人回答)

与执行
npm install socket.io
不同,您必须执行
npm install socket.io--save
以便socket.io模块安装在web开发文件夹中(在index.html或index.php所在的基本位置/运行此命令)。这会将socket.io安装到命令运行的区域,而不是全局,此外,它会自动更正/更新package.json文件,以便node.js知道它在那里


然后将源路径从
'/socket.io/socket.io.js'
更改为
'http://'+location.hostname+':3000/socket.io/socket.io.js'

,而这与OP无关,如果您在维护其他人的代码时遇到此问题,您可能会发现问题是由编码器设置
io.set('resource','/api/socket.io')引起的在应用程序脚本中,在这种情况下,您的HTML代码将是
type=“text/javascript”src=“/api/socket.io/socket.io.js”>

。。。“您可能想知道/socket.io/socket.io.js文件在哪里 来自,因为我们既不添加它,也不存在于文件系统中 io.listen在服务器上完成的部分魔术。它在服务器上创建一个处理程序 为socket.io.js脚本文件提供服务。”

从book Socket.IO实时Web 应用程序开发,第56页

您只需遵循即可

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(3000, function(){
  console.log('listening on *:3000');
});

如果您正在学习socket.io教程,则应按如下所示添加此行

app.use(express.static(path.join(__dirname, '/')))
这是因为在本教程中,Express将只捕获url
/
并发送
index.html
文件

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

但是,在
index.html
中,您有一个脚本标记(
)请求
socket.io客户端的资源,该资源未在
index.js
中路由(可以在控制台网络中找到url
http://localhost:3000/socket.io/socket.io.js
).

请检查代码中提到的目录路径。默认情况下,它是
res.sendFile(uu dirname+'/index.html')

确保将index.html放在正确的目录中

调试步骤

  • npm install socket.io——在静态文件(index.html)中保存
    。例如,您可能已经全局安装了它,当您查看调试器时,文件路径为空

  • 更改脚本文件并实例化套接字,显式添加您在服务器文件中设置的本地主机

     <script src="http://localhost:5000/socket.io/socket.io.js"></script>
         <script>
           const socket = io.connect("localhost:5000");
            $(() =>
    
     const cors = require("cors");
     const http = require("http").Server(app);
     const io = require("socket.io")(http);
    
    然后使用Express中间件
    app.use()
    方法实例化cors。将中间件放在与静态根文件的连接之上

     app.use(cors());
     app.use(express.static(__dirname));
    
  • 作为最后一项检查,请确保您的服务器已连接到分配端口的
    http.listen()
    方法,第一个参数是您的端口号,例如,我在这里使用了5000

     const server = http.listen(5000, () => {
       console.log("your-app listening on port", server.address().port);
     });
    
  • 由于
    io.on()
    方法正在工作,并且套接字数据已连接到客户端,请使用所需的回调逻辑添加
    io.emit()
    方法,并在前端JavaScript文件中再次使用
    socket.on()
    方法和所需的回调逻辑。检查数据是否流动


  • 我还编辑了上面的一条评论,因为它对我来说是最有用的,但是我还需要采取一些额外的步骤来使客户机-服务器连接正常工作。

    如果您想手动下载“socket.io/socket.io.js”文件并附加到html(而不想从服务器运行时获取),您可以使用

    
    
    您是否也从同一个节点应用程序提供HTML文件?可能重复@robertklep:啊,不,我有一个index.HTML页面。。。从app.js我得到信息:socket.iostarted@Bondye不,这不是问题所在here@hausinho如果HTML由其他服务器提供,则需要包含socket.io文件的完整URL:
    (或者其他主机名,显然)好的,将socket.io.js复制到一个我称之为js的文件夹中,所以现在是它的-但是现在我得到了错误!?!?!?这不是错误,这是连接请求,您必须在服务器/客户端中创建事件以与+1通信,在我最终找到这个源代码之前搜索了几个小时,发现有一个socket.io.js可能被复制到lib中。这是一个有用的解决方案,当只使用客户端而不使用服务器时。这应该是这个socket.io问题的有效答案。谢谢我也遇到了类似的问题,这与我正在重构旧代码这一事实有关,即使用
    app.listen(3000)。这是行不通的。当我把它改成
    server.listen(3000)它开始工作正常。我建议调用'var socket'的index.html
    
     const server = http.listen(5000, () => {
       console.log("your-app listening on port", server.address().port);
     });
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.min.js" integrity="sha512-eVL5Lb9al9FzgR63gDs1MxcDS2wFu3loYAgjIH0+Hg38tCS8Ag62dwKyH+wzDb+QauDpEZjXbMn11blw8cbTJQ==" crossorigin="anonymous"></script>