我可以在ExpressJS路由文件中发出一个套接字。但是客户端javascript不会读取发出的数据。
server.js
var express = require('express');
var path = require('path');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var bodyParser = require('body-parser');
app.use(express.static(__dirname + '/node_modules'));
app.use("/css", express.static(__dirname + '/css'));
app.use("/js", express.static(__dirname + '/js'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.set('io', io);
var aws_router = require('./app/routes')(app);
server.listen(8080);
应用/ routes.js
var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
var path = require('path');
var process = require('process');
var aws_router = function(app, io){
app.get('/', function(req, res) {
//need to read from database
var socketio = req.app.get('io');
var objShopper = "hello"
console.log(objShopper)
socketio.emit("viewdata", objShopper);
res.sendFile(path.join(process.cwd() + '/index.html'));
});
return router;
}
module.exports = aws_router;
套接字发出部分工作正常,至少我没有看到错误并在控制台中输出hello。但是当我尝试从客户端JS读取发出的数据时,我无法读取它。
client.js
$( document ).ready(function() {
var socket = io.connect('http://localhost:8080');
socket.on('viewdata', function (results) {
console.log("read data");
var objShopper = JSON.parse(results);
});
});
"read data"
永远不会在控制台中显示。我错过了什么?
答案 0 :(得分:1)
你有时间问题。您在连接之前尝试发送到套接字。这是事件的顺序:
/
的快速路由获取请求。io
个实例并执行io.emit()
。希望您可以看到第3步发生在第3步之后很久或换句话说,第3步发生在当前正在请求的页面之前,甚至连接到服务器的socket.io。因此,当您执行io.emit()
并迭代所有当前连接以将消息发送给所有这些连接时,当前正在请求的页面不在该列表中,因为它尚未建立连接。使用Javascript检查页面,使连接尚未发送到浏览器。
页面被请求时已知的数据应该放在页面中。还没有socket.io连接,因此您无法将其发送到那里。如果您希望它在页面中,请在页面中发送。
如果您不想将其放在初始页面中(由于某种原因),那么您可以让页面加载并运行并让页面中的Javascript通过Ajax调用从服务器请求数据或者当您的Javascript通过socket.io连接到您的服务器并且服务器看到传入的socket.io连接时,它可以发送数据(现在时间将是正确的,因为此时建立了socket.io连接)。 / p>
答案 1 :(得分:1)
除了 jfreind00 回答之外,我认为您应该在服务器端使用connection
事件,当客户端和服务器之间建立连接时会触发它,然后您可以发出数据给客户:
var aws_router = function(app, io){
app.get('/', function(req, res) {
res.sendFile(path.join(process.cwd() + '/index.html'));
});
//make sure client and server are connected
io.on('connection', function (socket) {
var objShopper = "hello"
console.log(objShopper)
socketio.emit("viewdata", objShopper);
});
return router;
}