我试图设置一个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发送消息给?它是如何知道客户何时可用的?任何帮助或教程指针将不胜感激。三江源。
答案 0 :(得分:0)
在客户端发送HTTP请求之前,您实际上并未设置数据库连接。看起来这可能永远不会发生由于同源问题(您的客户端代码似乎来自您所显示的服务器以外的其他地方)。
在任何情况下,您可能都希望设置连接以响应来自"connection"
的{{1}}事件(即移动当前在HTTP请求处理程序中的内容)。这就是它“知道客户何时可用”的方式。或者也许你应该在初始化过程中这样做。您的客户端代码似乎没问题,但它已脱离了上下文,因此很难判断它是否真的符合您的需求。