0

私はNodeJSにかなり慣れていませんが、Node JSを使用していくつかのAJAXを試したり、ファイルの読み取りと書き込みを試したりしています。ここで知りたいのは、Node JSサーバーがHTMLページに変更を指示できるかどうか、またはサーバーから変更方法に関する情報を受け取るためにページから何らかの要求が必要かどうかです。

(うまくいけば)明確にするために:ajax-retrieveクリックするとノードJSサーバーからの情報を要求するIDのボタンがあるとします。

$('#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

あなたはロングポーリングについて説明しているようです。これは、http接続が長時間開いたままになり、データが利用可能になるとチャンクで返送される手法です。より一般的には、あなたはサーバープッシュに本当に興味があると思います-サーバーはクライアントからの明示的な要求なしにデータを送り返します。これは長いポーリングに近いものです。node.jsの私のお気に入りのソリューションはsocket.ioです。これは、サーバープッシュのクリーンなラッパーを提供し、クライアントブラウザーで利用可能なものに基づいて多数のテクノロジー(長いポーリングを含む)を自動的に使用するライブラリです。

于 2013-01-23T19:09:13.343 に答える