0

我对 Node JS 还很陌生,但一直在尝试使用它进行一些 AJAX,并尝试读写文件。我现在想知道的是 Node JS 服务器是否可以告诉 HTML 页面进行更改,或者是否必须从页面发出一些请求才能从服务器接收有关如何更改的信息。

(希望)澄清:假设我有一个带有 id 的按钮,单击该按钮ajax-retrieve会从我的 Node JS 服务器请求一些信息:

$('#ajax-retrieve').click(function () {
    $.ajax({
        url: 'http://localhost:8124/',
        data: 'fn=open',
        dataType: "jsonp",
        cache: false,
        timeout: 5000,
        success: function(data) {
            console.log(data);
            $("#input-ready").html(data.save.text);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert('error ' + textStatus + " " + errorThrown);
        }
    });
});

在成功从服务器接收到一些数据后,回调(如您所见)将数据记录在控制台中,并将其中的一部分放入具有 id 的元素中input-ready。但是,如果请求失败或超时,则会出现一个警告框,提供错误的详细信息。

这大致是服务器端代码的样子:

http.createServer(function (req, res) {
    "use strict";
    var queryObj = url.parse(req.url, true).query;
    queryObj.fn = queryObj.fn || '';
    queryObj.callback = queryObj.callback || '';

    if (queryObj.callback) {
        if (queryObj.fn === 'open') {
            fs.readFile('jsonp-storage-2.txt', function (err, data) {
                if (err) {
                    throw err;
                } else {
                    queryObj.save = data;
                    res.writeHead(200, {'Content-Type': 'application/javascript'});
                    res.write(queryObj.callback + '({ fn: "' + queryObj.fn + '", save: ' + queryObj.save + ' })');
                    res.end();
                }
            });
        } else {
            console.log('Function (fn property) not recognised.');
        }
    }
}).listen(8124);

但是,如果服务器在将数据传递到我的 HTML 页面之前需要对数据做一些更复杂的事情怎么办?如果我的服务器代码可能需要一些时间来做这件事怎么办?有没有办法将返回的数据分块并在准备好时返回相关部分,或者需要来自我的 HTML 页面的单独请求?

理想情况下,我不希望我的 HTML 页面必须继续向服务器请求它已经请求的信息,以查看它是否已准备好。我想要的是某种回调,以便在服务器完成时 HTML 页面接收它需要的数据并相应地更改显示?这可能是一个基本问题,但我所描述的可能吗?

4

2 回答 2

1

由于您想双向查看socket.ioSockJS

于 2013-01-23T19:08:56.680 回答
1

您似乎在描述long polling,一种将 http 连接保持打开很长时间的技术,并且数据在可用时以块的形式发送回来。更一般地说,我认为您对服务器推送非常感兴趣- 服务器在没有客户端明确请求的情况下发送回数据,这很接近长轮询。我最喜欢的 node.js 解决方案是socket.io,这是一个库,它提供了一个干净的服务器推送包装器,并根据客户端浏览器中可用的内容自动使用多种技术(包括长轮询)。

于 2013-01-23T19:09:13.343 回答