我的应用程序是一个Web界面,用于监控"对象"由个人电脑处理,特别是当他们超过特定的门槛时。
Node Js服务器在同一台PC上运行,并且只使用在表上显示数据,当其中一个达到给定阈值时刷新它。 此时计算"对象的程序"打开一个到Node Js服务器的套接字并发送json数据。
我的问题是在用户浏览器上重新加载页面以显示新的resoults而无需用户手动点击浏览器刷新按钮。
对于服务器,我使用了express,express-ejs-layouts和body-parser模块。
这是我的服务器代码:
// require our dependencies
var express = require('express');
var expressLayouts = require('express-ejs-layouts');
var bodyParser = require('body-parser');
var app = express();
var port = 3000;
// use ejs and express layouts
app.set('view engine', 'ejs');
app.use(expressLayouts);
// use body parser
app.use(bodyParser.json({extended : true}));
// route our app
var router = require('./app/routes');
app.use('/', router);
// set static files (css and images, etc) location
app.use(express.static(__dirname + '/public'));
// start the server
app.listen(port, function() {
console.log('app started');
});
抛开页面estetics(css,images,layouts)服务器的核心, 服务GET和POST请求在routes.js文件上,在GET请求上呈现将传递JSON数据的页面呈现到包含该表的javascript页面,并且在POST请求中保存由我的"对象"传递的JSON。计算器。
这是routes.js代码:
// require express
var express = require('express');
var path = require('path');
// create our router object
var router = express.Router();
// export our router
module.exports = router;
router.post("/", function(request, response) {
global.exportage = request.body;
});
// route for our homepage
router.get('/displayobj', function(req, res) {
//res.send(global.exportage);
res.render('pages/displayobj',{data:global.exportage});
});
你如何看待我使用一个非常糟糕的全局变量来传递数据,但我希望尽可能简单。
如果收到新的JSON,我怎么能强制在用户浏览器上重新加载?
我尝试使用location.reload(true),但在执行过程中遇到错误:"位置未定义"。
在我看来,问题是服务器满足浏览器发出的GET请求,没有其他事情发生,因为通信已经完成。我不想以固定的时间间隔刷新页面,而是使用新的JSON作为触发事件(在阅读评论后编辑)。
答案 0 :(得分:1)
您无法通过简单的HTTP请求从服务器到客户端进行实时通信。考虑使用长轮询或websockets。
最简单的解决方案是使用像Socket.io这样的库来处理它。当需要刷新内容时,将事件发送到客户端,然后使用window.location.reload()
刷新或使用DOM API更新内容。