【问题标题】:node.js server and client sideo code to connectnode.js 服务器和客户端 sideo 代码连接
【发布时间】:2012-07-13 04:58:40
【问题描述】:

我正在尝试设置一个 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 向其发送消息的客户端是否应该有服务器?它如何知道客户何时可用?任何帮助或指导教程将不胜感激。谢谢。

【问题讨论】:

    标签: javascript postgresql node.js


    【解决方案1】:

    在客户端发送 HTTP 请求之前,您实际上并没有设置数据库连接。由于同源问题,这似乎永远不会发生(您的客户端代码似乎来自您显示的服务器以外的其他地方)。

    无论如何,您可能希望建立连接以响应来自io.sockets"connection" 事件(即将HTTP 请求处理程序中当前存在的内容移动到那里)。这就是它“知道客户何时可用”的方式。或者,也许您应该将其作为初始化的一部分。您的客户端代码看起来不错,但它与上下文无关,因此很难判断它是否真的符合您的需求。

    【讨论】:

    • 是的,客户端代码将在服务器的其他位置运行。我只想在触发器写入侦听器时向用户推送消息。是否可以设置一个服务器客户端,然后node.js脚本在收到来自Postgres的消息时可以向客户端服务器发送消息?如果这有意义?
    • 如果您还没有这样做,请查看 socket.io 的 README 文件中的前几个示例。您似乎对在客户端需要一个“服务器”的想法感到困惑。你没有。 socket.io 只是在客户端创建一个连接,当服务器向它发送消息时触发事件;您的客户端代码对它们的响应方式与对鼠标单击或击键的响应方式相同。
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多