我正在尝试使用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,只能修改端口。
答案 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已经发布,这是我尚未尝试解决的问题。
干杯