如何实时更新JSON响应(Express NodeJS)

时间:2016-10-21 02:10:06

标签: json node.js express

基本上我想要做的是使用express在用户访问/时返回一个JSON对象。我知道如何发送类似Hello World甚至整个文件的内容,但我不知道如何只发送一个JSON对象(例如{"foo":1}),以便我可以更新客户端的数据。例如。假设我在用户访问/时发送了上述JSON({"foo":1})。然后我如何更改foo的值(例如,每秒递增一次)并返回该值而无需客户端重新加载其页面?

2 个答案:

答案 0 :(得分:1)

所以,假设你的快递后端有这样的东西:

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>

答案 1 :(得分:0)

您可以在此处找到一些有关您需要的示例的好信息。

http://hungtran.co/long-polling-and-websockets-on-nodejs/