没有从路由器调用Socket.io



我试图将socket.io传递到路由器,然后从该路由器发出调用,但它从未发出。我怀疑传递到路由器的socket.io中有问题。

apps的外观:

//app.js
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var logger = require('morgan');
var weather = require('./routes/weather');
server.listen(3000, function () {
weather.refreshWeather();
console.log('Listening on http://localhost:3000');
});
app.use(logger('dev'))
app.use(express.static(__dirname + '/public'))
app.use('/', weather.router(io));
app.set('view engine', 'jade');
module.exports = app;

weather.js的外观:

//weather.js
var express = require('express');
var router = express.Router();
var returnRouter = function (io) {
router.get('/weather', function (req, res, next) {
console.log('About to emit!');
io.sockets.emit('weather', {
temperature : '12' // this is just a test value
});
res.render('weatherpage');
next();
});
return router;
}
module.exports = {
router: returnRouter, // exports variable
refreshWeather : refreshWeather // exports function
}

最后是玉的外观:

//weatherpage.jade
doctype html
html
head
link(rel='stylesheet', href='/css/index.css')
title Dashboard
body
script(src='/socket.io/socket.io.js')
script.
var socket = io();
socket.on('weather', function(data){
document.getElementById('weather').innerHTML = data.temperature
});

Socket.io被称为fine。你的问题是套接字事件被发出,然后你渲染玉模板!当页面呈现时,该事件早已过去。然而,如果你已经渲染了页面,比如在另一个浏览器窗口中,你会发现其他页面会像你预期的那样更新。

如果您在渲染weatherpage模板时有天气数据,只需正常对其进行模板化,并在页面提供后继续侦听套接字事件以更新页面。

为带有套接字侦听器的页面提供服务的路由处理程序几乎从来都不是发出套接字事件的地方,套接字事件本应在同一页面上呈现。我认为,如果您想在到达端点时更新所有客户端,这是有意义的。

想想你在做什么。温度变化数据在哪里生成?你说每一分钟。那是发射套接字事件的地方。浏览器中的每个渲染的(已提供的)天气页面都将更新。

因此,根据用户sarju的建议,我将这一点添加到了我的app.js 中

module.exports = function socketEmit(id,data){
io.sockets.emit(id,data);
}

还有我的weather.js

require('../app')('weather', {
temperature : temperature
});

我不确定这是最好还是最聪明的方法,但它对我有效。如果有人有更好的建议,我会很乐意将其标记为正确答案。

最新更新