Socket.io - 引用错误:io未定义。

41
我正在为Android 2.3.5编写一个应用程序(也将与iOS兼容)。我希望将应用程序的HTML / JavaScript中的数据传输到运行Twisted引擎的服务器上的Python程序。
我尝试了许多方法并查看了各种论坛、答案、教程和网页,包括这里的大部分内容,但无法找到答案。以下是我在index.html文件中所使用的相关JavaScript代码:
<script src="socket-lib/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
function sendData() {
    try {
        var socket = io.connect('http://mywebsite.com:12345');
        socket.on('connect', function(data) {
            socket.send('Hello.');
            socket.on('message', function (msg) {
                socket.send('This is where I send data?');
            });
        });
    }
    catch(err) {
        alert('ERROR: socket.io encountered a problem:\n\n' + err);
    }
} // end of sendData
如果你没看出来,我还是很困惑这个是如何工作的;我甚至无法测试任何东西。一直出现的错误是:ReferenceError: io is not defined。一些网站使用类似于 var io = require('socket.io'); 的东西。但结果仍出现相同的错误:ReferenceError: require is not defined
我将 socket-lib 文件夹放在 assets/www 中,这也是任何其他 JavaScript 源应该放置的位置。这也是 index.html 文件的位置。许多网站使用 <script src="/socket.io/socket.io.js"></script>,但这对我来说毫无意义。许多网站还暗示了使用 node.js,但我从未在任何地方看到过它。
我该怎么做才能使其运行?

4
我找到了答案,对于那些由于socket.io文档缺乏而感到极度困惑的人。你不能引用"/socket-lib/socket.io.js"文件;你必须引用"http://yourwebsite.com:12345/socket.io/socket.io.js"。服务器会自动为你完成其余的工作。 - Ness
您是我新的最喜欢的人!他们在socket.io上的示例非常误导。 - Jason Welch
根据文档,自版本1.0以来,您可以从CDN请求客户端库:http://socket.io/blog/introducing-socket-io-1-0/#cdn-delivery - maxwell2022
11个回答

76

我找到了一个答案,可以帮助那些因为 socket.io 缺乏可怕的文档而感到非常困惑的人。

你不能使用 /socket-lib/socket.io.js 来引用该库,

你必须使用 http://yourwebsite.com:12345/socket.io/socket.io.js

服务器会自动为您完成其余工作。


2
这里提到的端口号(12345)就是node运行socket.io的端口。 - siddhusingh
我忘记在/etc/apache2/httpd.conf中创建VirtualHost以指向我的节点服务器运行的端口,对于我的情况,它是<VirtualHost *:8000>... - mlunoe
@trust_words 或许你的代码还有其他问题?我已经五年没用过socket.io了,所以帮不上太多忙,但我可以建议使用codebeautify.org/jsvalidate来尝试找到可能出错的地方。 - Ness
1
我打开了一个新目录,安装了依赖项,它工作了!有时候,这只是一个糟糕的安装...也许是损坏的依赖项(或权限)的问题。 - salouri
这太有帮助了。 - JHM16
显示剩余3条评论

6

我通过修改index.html文件来导入socket io客户端并解决了问题,首先我安装了bower组件:

 bower install socket.io-client

然后我将index.html中的引用更改为:
 <script src="bower_components/socket.io-client/socket.io.js"></script>

或者文件可以在 lib/socket.io-client/dist/socket.io.js 找到。


3

我勉强完成了这个任务,浪费了大约一个小时,最后发现只是一个非常基本的错误。

当一个函数没有被定义时会怎样?例如 "Uncaught ReferenceError: io is not defined"。这难道不意味着该函数在“创建”之前就已经被“调用”了吗?

在我的 HTML 文件中,“调用” JavaScript 文件的部分看起来像这样:

<script src='./js/playerChatter.js'></script> <!-- this one calls io -->
<script src="http://localhost:2019/socket.io/socket.io.js"></script><!-- This Creates io -->

我将其修改为这样

<script src="http://localhost:2019/socket.io/socket.io.js"></script> <!-- This Creates  io -->
<script src='./js/playerChatter.js'></script> <!-- this on calls io -->

所以现在,“io”这个项目,无论是对象还是函数......实际上在使用之前就已经被创建了:D
玩得开心!

2

在socket.io.js文件中编写服务器端代码,并尝试使用src =“/ socket.io / socket.io.js”

希望这可以解决您的问题


1

当使用require.js将socket.io与许多其他库一起使用时,我遇到了同样的错误,原因是尝试从与其他文件相同的/js文件夹中加载socket.io.js文件。

将其放置在一个单独的文件夹中,对我来说解决了这个问题,您可以查看此代码片段中的代码,但我为使其正常工作所做的所有更改都是:

而不是:

socketio: 'socket.io',

使用:

socketio: '../socket.io/socket.io',

不确定此行为的原因,但希望能对您有所帮助。


由于安装的socket.io包的文件夹结构,它必须指向根服务器文件夹,然后指向socket.io路径。 - kabuto178

0
如其他答案所提到的,您必须使用完整的URL。 <script src="http://127.0.0.1:5565/socket.io/socket.io.js"></script> 如果出现404错误,请检查服务器端是否正确地实例化了io。如果没有,请参考以下内容正确地实例化io。
<script>
  var socket = io();
</script>

在你的 server.js 文件中

const app = express();
const http = require('http'); //from express module
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);

0

访问网址/socket.io/socket.io.js,检查是否提供了一个JS文件,如果是,则不要写

var socket = io();

window.onload= function(){
var socket = io();
}

0

看起来你的浏览器找不到socket.io.js文件。你可以尝试使用Firefox+Firebug或Chrome Web开发者工具打开index.html,并查看如何请求.js文件。另一方面,你可以检查提供.js文件的Web服务器日志是否有任何文件未找到错误。

require函数将由例如RequireJS提供,但你仍需要正确配置脚本路径才能使其正常工作。


你还有其他建议吗?我还是无法让它工作。 - Ness
没有实际看到你的代码和目录结构,很难说出问题出在哪里。也许你可以把你的进展上传到某个地方? - Stefan Seemayer
所有相关的代码已经发布了。即使删除所有其他JavaScript,问题仍然存在。至于目录结构,它在Eclipse SDK中,项目名为HelloWorld。文件“index.html”和文件夹“socket-lib”都在“HelloWorld/assets/www”中。我认为唯一重要的另一个文件是Java文件:“HelloWorld/src/com.helloworld.helloworld/Hello.java”。它是默认创建的;我在那里做的唯一一件事就是将setContentView()行更改为super.loadUrl("file:///android_asset/www/index.html"); - Ness

0

在我经过调试所有非常有用的建议之后,结果发现问题很简单,就是我的Node服务器停掉了。在开发期间,我一直在终端窗口手动运行它。

确保你的Node [yourservercode].js 在指定的端口上运行! :-]


0

我使用jspm。

添加这个:

import 'btford/angular-socket-io/mock/socket-io';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接