0

クライアントにメッセージを送信するようにnode.jsサーバーを設定しようとしています。クライアントは、jquery通知ライブラリを使用してメッセージを表示します。興味がある場合は、この通知ライブラリを使用しています:http: //needim.github.com/ noty/

その瞬間、リスナーに書き込むためのトリガーを持つテーブルでpostgresデータベースをセットアップしました。

トリガーは次のとおりです。

CREATE OR REPLACE FUNCTION new_noti() RETURNS trigger AS $$
DECLARE
BEGIN
    PERFORM pg_notify('watchers', TG_TABLE_NAME || ',msg,' || NEW.msg );
    RETURN new;
END; 
$$ LANGUAGE plpgsql;

次に、次のようにnode.jsサーバーがあります。

var pg = require ('pg');

var pgConString = "pg://aydin:password@localhost/test"

var app = require('http').createServer(handler)
    , io = require('socket.io').listen(app)
    , url = require('url')

app.listen(8080);

function handler (request, respsonse) {
    var client = new pg.Client(pgConString);
    client.connect();
    client.query('LISTEN "watchers"');
    client.on('notification', function(msg) {
        console.log(msg.payload);
        sendMessage(msg.payload);
    });
}

function sendMessage(message) {
    io.sockets.emit('notification', {'message': message});
}

次に、次のようなクライアントコードがあります。

<script type="text/javascript">
    var socket = io.connect('http://localhost:8080');
    socket.on('notification', function (data) {
        console.log(data.message);
        newNoty(data);
    });

    function newNoty(data) {
        noty({
            "text":data.message,
            buttons: [{
                type: 'button green',
                text: 'Go to' 
            }],
            "theme":"noty_theme_twitter",
            "layout":"bottomRight",
            "type":"information",
            "animateOpen":{
                "height":"toggle"
            },
            "animateClose":{
                "height":"toggle"
            },
            "speed":500,
            "timeout":7500,
            "closeButton":true,
            "closeOnSelfClick":true,
            "closeOnSelfOver":false,
            "modal":false,
        });
    }
</script>

これは機能しません。node.jsがpostgres通知を受信しないようです。これは、関数ハンドラーを使用していて、クライアントコードから実際にリクエストを実行していないためだと思います。これを行う方法と、それが正しい方法かどうかわかりませんか?リクエストではなく接続で起動できる関数はありますか?

そして、私もそれを正しい方法でやっていますか?node.jsがメッセージを送信するクライアント側にサーバーが必要ですか?クライアントがいつ利用可能であるかをどのように知るのですか?ヘルプやチュートリアルへのポインタをいただければ幸いです。ありがとうございました。

4

1 に答える 1

0

クライアントがHTTPリクエストを送信するまで、実際にはデータベース接続を設定していません。同一生成元の問題が原因で、これが発生することはないようです(クライアントコードは、表示したサーバー以外の場所から送信されているようです)。

いずれの場合も、からの"connection"イベントに応答して接続を設定する必要がありますio.sockets(つまり、現在HTTPリクエストハンドラーにあるものをそこに移動します)。これが「クライアントがいつ利用可能かを知る」方法です。または、初期化の一部として実行する必要があるかもしれません。クライアント側のコードは問題ないように見えますが、コンテキストから外れているため、ニーズに本当に合っているかどうかを判断するのは困難です。

于 2012-07-12T20:58:40.343 に答える