我試圖設置一個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發送消息的客戶端有一個服務器?它如何知道客戶端何時可用?任何幫助或指導教程將不勝感激。謝謝。
是的客戶端代碼將運行在其他地方從服務器。我只想在觸發器寫入監聽器時能夠將消息推送給用戶。是否可以建立一個服務器客戶端,然後當node.js腳本收到來自Postgres的消息時,它可以向客戶端服務器發送消息?如果這有道理? – 2012-07-12 21:12:07
如果您還沒有這樣做,請查看socket.io的README文件中的前幾個示例。你似乎掛在了客戶端需要「服務器」的想法上。你沒有。 socket.io只是在客戶端創建一個連接,當服務器向它發送消息時觸發事件;您的客戶端代碼將以與響應鼠標點擊或擊鍵相同的方式響應它們。 – ebohlman 2012-07-13 03:35:49