我试图将socket.io传递给路由器,然后从该路由器发出呼叫,但它永远不会发出。我怀疑socket.io传递给路由器的问题。
app.js的外观:
//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
});
答案 0 :(得分:1)
Socket.io被称为罚款。你的问题是发出socket事件,然后你渲染玉模板!在页面呈现时,事件早已消失。但是,如果您已经在另一个浏览器窗口中显示了页面,那么您将发现其他页面会按预期更新。
如果在渲染天气页模板时有天气数据,只需正常模板并继续侦听套接字事件,以便在服务后更新页面。
为具有套接字侦听器的页面提供服务的路由处理程序几乎不会发出要在同一页面上呈现的套接字事件。我想如果你想在终端被击中时更新所有客户端,那就没有意义了。
想想你在做什么。温度变化的数据在哪里生成?你说每一分钟。这是发出套接字事件的地方。
将更新浏览器中每个已呈现(已提供)的天气页面。答案 1 :(得分:0)
因此,根据用户sarju的建议,我将此位添加到我的app.js
new Date().GetTime();
这一点对我的weather.js
module.exports = function socketEmit(id,data){
io.sockets.emit(id,data);
}
我不确定这是否是最好或最聪明的方法,但它对我有用。如果有人有更好的建议,我很乐意将其标记为正确答案。