所以,假设你的 express 后端有这样的东西:
var obj = {foo: 1};
setInterval(
function(){ obj.foo++; }),
1000
);
app.route('/').get(function(req, res, next) {
res.json(obj);
});
假设您正在使用 ajax 提取数据。 (使用 jQuery,因为纯 javascript ajax 会变得冗长。)
<script>
var foo = 0;
$.get( "http://backend:3000/", function( data ) {
foo = data.foo;
});
</script>
如果您想保持 foo 的更新,您可以进行“长轮询”(每隔几秒不断请求数据并更新它):
function updateFoo(){
$.get( "http://backend:3000/", function( data ) {
foo = data.foo;
// Expect each request to take some time as well...
setTimeout( updateFoo, 1000);
});
}
updateFoo(); // Call once to start polling.
我们曾经这样做是因为服务器无法向客户端发起请求。因此,每次您想要更新时,您都必须提出要求。随着您的应用程序的增长以及许多用户的使用,服务器也会感到恼火,这样做会变得很混乱。 (别戳我了!)
但是现在我们有 websockets。使用 node.js socket.io 真的很合适。至于您关于发送整个页面的评论,我猜您指的是 socket.io get-started-example:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
// I assume you are refering to this?
// It's only purpouse is to serves the front-end to the user.
// If you are serving your app using Apache or perhaps Nginx, then you can remove it.
app.get('/', function(req, res){
res.sendfile('index.html');
});
io.on('connection', function(socket){
console.log('a user connected');
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
如果你分离前端和后端,那么你还需要将你的客户端脚本指向你的 socket-io 后端:
<script>
// As opposed to just "io();" when express is serving both front and back:
var socket = io('http://backend:3000');
socket.on('foo', function (data) {
console.log(data);
});
</script>