【问题标题】:Socket.IO - require is not definedSocket.IO - 要求未定义
【发布时间】:2012-01-02 09:01:18
【问题描述】:

我正在尝试让 socket.io 正常工作,但现在在 Chrome 中出现错误:

Uncaught ReferenceError: require is not defined

client.php:9Uncaught ReferenceError: io is not defined

我更改了包含 socket.io.js 文件的方式,因为它在其他地方不存在:

<script src="/node_modules/socket.io/lib/socket.io.js"></script>

如果我尝试

<script src="/socket.io/socket.io.js"></script>

我得到:加载资源失败:服务器响应状态为 404(未找到)

这是在 Ubuntu 上的最新版本

我正在使用来自http://socket.io/ 的服务器代码在与 client.php 相同的文件夹中工作,并且该代码命名为 server.js,仅修改了端口。

【问题讨论】:

  • 你的服务器端代码是什么?另外,/node_modules/socket.io/lib/socket.io.js 是完全错误的,不要那样做。
  • 嗨!谢谢我刚刚更新我的帖子说我正在使用来自socket.io 的服务器示例,为什么我现在应该使用“/node_modules/socket.io/lib/socket.io.js”?这是通往 socket.io.js 的唯一方法,但是无论如何它都不起作用:/
  • client.php 中有什么?这不应该对 apache 或 php 之类的东西做任何事情。
  • 嗨,Johan,你最后做了什么来解决这个问题?由于 Apache/Nginx 服务于 80 端口,那么您访问 socket.io 的解决方法是什么?

标签: html node.js socket.io


【解决方案1】:

事实上,我今天成功地让 Apache 提供了这些文件。

只需创建一个副本(我实际上复制了文件,软链接可能还可以我没有尝试) 将 node_modules/socket.io/node_modules/socket.io-client/dist 的内容复制到您的 Web 根目录。对于我在全局安装 socket.io 的 socket.io (0.9.16) 安装,这两个命令起到了作用:

sudo cp -av /usr/lib/node_modules/socket.io/node_modules/socket.io-client/dist /var/www/socket.io 
chown -R www-data:www-data /var/www/socket.io

这是在 Ubuntu 13.10 机器上安装的常用 LAMP 堆栈,然后我添加了 node.js。

现在,随着新版本 socket.io 的发布,保持此副本同步是我尚未尝试解决的问题。

干杯

【讨论】:

    【解决方案2】:

    您是否在服务器上使用 PHP 运行 node.js

    有两个“socket.io”包,一个服务器和一个客户端。您正在尝试在浏览器中加载 server 之一 (/node_modules/socket.io/lib/socket.io.js)。您想要的脚本名为 socket.io-client,您可以在 https://raw.github.com/LearnBoost/socket.io-client/master/socket.io-client.js

    找到它

    当您在端口 80 上运行节点时,socket.io 会自动从端口 80 提供 /socket.io/socket.io.js(客户端文件)文件。在您的情况下,Apache 已经位于端口 80,因此您需要手动提供文件。

    【讨论】:

    • 也可以。但是,他也可以只通过
    • 谢谢,这是我的问题。
    • 感谢这个工作,socket.io 文档不清楚...我不明白什么是最好的方法 =) - +1
    【解决方案3】:

    正如其他人所指出的,当 io 在服务器端运行时,会提供“socket.io.js”的“自动”服务 - 它会分支到其 lib 目录中的其他 js 文件。

    我想补充的是,这不是直观的,不,您不能让您的常规网络服务器提供此文件 - 错误只会变得更加奇怪且看似矛盾(需要未定义等)。这不是一个普通的 js 文件,我希望所有的教程都强调这一点。

    无论如何,例如,如果您在 nginx 后面运行,请将端口设置设置为分配给节点的相同端口 - 在我的情况下为端口 3000。我在客户端中使用该端口是这样的:

      <script src="http://localhost:3000/socket.io/socket.io.js"></script>
    

    ...然后还在服务器代码中使用了端口 3000 - 有太多的方式/版本可以编写 server-js-code 的示例来做任何事情,但会混淆大多数使用“不同方式”的人.

    【讨论】:

      【解决方案4】:

      您的库在您的客户端浏览器编码中包含 (/socket.io/socket.io.js) 可能没问题。 但是您可能指向了错误的 socket.io.js 副本 如果您使用 (npm install socket.io) 安装了 socket.io,那么您可能需要在以下目录中查找 socket.io.js 的客户端版本:

      C:\Program Files (x86)\nodejs\node_modules\socket.io\node_modules\socket.io-client\dist\socket.io.js

      如果它在那里,那么您可能需要将该模块复制到您的网络发布目录, 或者,您可以更改虚拟目录指向的物理路径。

      【讨论】:

        【解决方案5】:

        我尝试了 thejh 所说的,它确实有效。我需要指定主机和端口。对于侦听端口 81 的节点应用程序,我需要在客户端 javascript 中指定端口 81。没关系 /socket.io/socket.io.js 在虚拟主机中不存在,节点在运行时弥补它。

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,我确认@thejh 的解决方案有效。 然而,当我阅读他的建议时,我不确定服务器是“什么”。我确实在端口 80 上运行了 MAMP。下面的代码是“node.js 服务器”,它在端口 8001 上运行。

          一旦我启动了 node.js 服务器(运行下面的代码),访问 http://localhost:4001/socket.io/socket.io.js 就会返回 javascript 文件。

          /* Node.js server */
          
          var sys  = require('sys');
          var io   = require('socket.io');
          var http = require('http')
          server = http.createServer(function(req, res) { 
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.write('http server started');
            res.end(); 
          });
          server.listen(4001);
          
          
          // socket.io 
          var socket = io.listen(server); 
          socket.on('connection', function(client) {
          
            client.on('message', function(message) {
              // We're in!
              console.log('received client message '+ message);
            }); 
            client.on('disconnect', function() {});
            socket.send('welcome to the local node.js server!');
          });
          

          对于 Drupal 中的用户,hook_init 中的 drupal_add_js('http://localhost:4001/socket.io/socket.io.js', array('type' =&gt; 'external', 'group' =&gt; JS_LIBRARY)); 可以解决问题。

          【讨论】:

            【解决方案7】:

            如果您看到类似require() is not defined 的内容,可能是因为您使用的 JavaScript 库的格式为 AMD (Asynchronous Module Definition)。尝试使用RequireJS(全功能)或the curl JS library(更小、更简单)来加载SocketIO。

            【讨论】:

              【解决方案8】:

              如果您的脚本不是来自您的网络服务器,这将不起作用:

              <script src="/socket.io/socket.io.js"></script>
              

              您必须明确说明主机和端口:

              <script src="http://localhost:<port>/socket.io/socket.io.js"></script>
              

              【讨论】:

              • 我的服务器上确实有脚本,但它不在 /socket.io/socket.io.js/ 中,它在 node_modules 文件夹中,即使我移动它,它也会告诉我要求未定义。
              • @JohanSvensson:脚本由您的节点服务器神奇地提供服务。
              • 我的服务器是指我在端口 80 上运行的 apache 服务,用于托管包含来自 socket.io 的“客户端”代码的 php 文档,并且我希望 node/socket.io 在另一个端口上运行您可以从浏览器连接到。
              • @JohanSvensson:嗯,你必须从你的 nodejs 服务器中包含脚本。不是来自你的 apache。该死,试试我发布的内容!
              • 这是一个端口的事情。 @thejh 的第二个样本可以解决问题
              猜你喜欢
              • 2019-04-15
              • 2016-08-10
              • 2018-06-15
              • 2019-08-20
              • 2018-05-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多