我正在尝试创建一个简单的脚本,以便每次文件更新时都将文件中的数据发送到客户端。我已经测试过,发现该文件已被读取,但是客户端什么也没收到。控制台中没有错误。我对socket.io相当陌生。
node.js代码
var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); var fs = require("fs"); var port = process.env.PORT || 3000; app.get('/', function(req, res){ res.sendFile(__dirname + '/popup.html'); }); fs.watchFile("assets/popup.json", {interval:100}, function(curr, prev) { fs.readFile("assets/popup.json",{encoding:"utf8"}, function(err, data){ io.emit("popup", data) }) }); http.listen(port, function(){ console.log('listening on *:' + port); });
客户代码
var socket = io(); socket.on('popup', function(msg){ alert("hello") });
每当事情无法正常进行时,您都需要诉诸“调试模式”。在这种模式下,您需要收集所有可能发生的事件,并从中学到什么。为此,请将以下代码添加到客户端:
var socket = io(); socket.on('popup', function(msg){ console.log("hello: ", msg) }); socket.on('connection', function() { console.log("client connected"); }); socket.on('connect_error', function(err) { console.log("client connect_error: ", err); }); socket.on('connect_timeout', function(err) { console.log("client connect_timeout: ", err); });
这些消息都记录在socket.io Github站点上的客户端文档中,您可以随时通过谷歌搜索“ socket.io github”来找到它们。
然后,查看页面加载后在浏览器控制台中看到的内容。如果您不知道如何在使用的浏览器中打开浏览器控制台,请在Google上进行查找。页面加载时,您需要查看调试控制台。
仅供参考,我们假设您已在此代码之前通过脚本标记将socket.io加载到页面中。如果不是,该错误也会显示在控制台中。
然后,OP收到此错误:
client connect_error: Error: server error at Socket.onPacket (socket.io-1.2.0.js:1) at XHR.<anonymous> (socket.io-1.2.0.js:1) at XHR.Emitter.emit (socket.io-1.2.0.js:1) at XHR.Transport.onPacket (socket.io-1.2.0.js:1) at callback (socket.io-1.2.0.js:2) at Object.exports.decodePayload (socket.io-1.2.0.js:2) at XHR.Polling.onData (socket.io-1.2.0.js:2) at Request.<anonymous> (socket.io-1.2.0.js:2) at Request.Emitter.emit (socket.io-1.2.0.js:1) at Request.onData (socket.io-1.2.0.js:2)
好,进展。您如何在客户端页面中加载socket.io?似乎您的客户端和服务器中的socket.io版本不匹配。您应该这样做:
<script src="/socket.io/socket.io.js"></script>
然后您的服务器将向客户端页面提供完全相同版本的socket.io。另外,由于此错误报告了客户端socket.io 1.2.0,因此服务器上安装了哪个版本的socket.io?