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