2012-07-12 72 views
0

我試圖設置一個node.js服務器發送消息到客戶端,然後將顯示消息使用jQuery通知庫,我使用這個notifcation庫如果任何人的興趣:http://needim.github.com/noty/node.js服務器和客戶端sideo代碼連接

在那一刻我有一個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:[email protected]/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通知,我想這是因爲我使用函數h安德勒,我實際上並沒有從客戶端代碼發出任何請求。我不知道如何做到這一點,以及它是否是正確的方式? 有沒有一個函數可以觸發連接而不是請求?

我是否正確地做了這件事?應該在node.js發送消息的客戶端有一個服務器?它如何知道客戶端何時可用?任何幫助或指導教程將不勝感激。謝謝。

回答

0

在客戶端發送HTTP請求之前,您並未實際設置數據庫連接。看起來這可能永遠不會發生,原因是同源問題(您的客戶端代碼似乎來自您顯示的服務器以外的其他地方)。

在任何情況下,你可能想建立響應"connection"事件從io.sockets連接(即移動這是目前在HTTP請求處理存在的東西)。這就是它「知道客戶何時可用」的方式。或者,也許你應該把它作爲初始化的一部分。你的客戶端代碼似乎沒問題,但是它沒有上下文,所以很難判斷它是否真的適合你的需求。

+0

是的客戶端代碼將運行在其他地方從服務器。我只想在觸發器寫入監聽器時能夠將消息推送給用戶。是否可以建立一個服務器客戶端,然後當node.js腳本收到來自Postgres的消息時,它可以向客戶端服務器發送消息?如果這有道理? – 2012-07-12 21:12:07

+0

如果您還沒有這樣做,請查看socket.io的README文件中的前幾個示例。你似乎掛在了客戶端需要「服務器」的想法上。你沒有。 socket.io只是在客戶端創建一個連接,當服務器向它發送消息時觸發事件;您的客戶端代碼將以與響應鼠標點擊或擊鍵相同的方式響應它們。 – ebohlman 2012-07-13 03:35:49