Socket.IO - require未定义

时间:2011-11-20 14:10:55

标签: html5 node.js socket.io

我正在尝试使用socket.io,但现在在Chrome中我收到了错误:

未捕获的ReferenceError:未定义require

client.php:9未捕获的ReferenceError:未定义io

我改变了包含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,只能修改端口。

8 个答案:

答案 0 :(得分:31)

如果您的脚本不是来自您的网络服务器,则无法使用:

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

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

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

答案 1 :(得分:16)

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

有两个“socket.io”包,一个服务器和一个客户端。您正尝试在浏览器中加载服务器一个(/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(客户端1)文件。在您的情况下,Apache已经在端口80,因此您需要手动提供该文件。

答案 2 :(得分:5)

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

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

如果有,那么您可能希望将该模块复制到您的Web发布目录, 或者,您可以更改虚拟目录指向的物理路径。

答案 3 :(得分:1)

我尝试了jh所说的并且它有效。我需要指定主机和端口。对于在端口81上侦听的节点应用程序,我需要在客户端javascript中指定端口81。 Nevermind /socket.io/socket.io.js在vhost中不存在,节点在运行时弥补它。

答案 4 :(得分:1)

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

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

无论如何,如果你在nginx后面运行,例如,在我的情况下,将port-settings设置为为node-port 3000分配的同一端口。我在客户端使用了这样的端口:

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我有同样的问题,我确认@ 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中的人,drupal_add_js('http://localhost:4001/socket.io/socket.io.js', array('type' => 'external', 'group' => JS_LIBRARY));中的hook_init可以解决问题。

答案 7 :(得分:0)

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

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

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

在我添加node.js之前,这是在Ubuntu 13.10盒子上安装的通常的LAMP堆栈。

现在保持这个副本同步,因为新版本的socket.io已经发布,这是我尚未尝试解决的问题。

干杯