Node.js 和 postgres 听
Posted
技术标签:
【中文标题】Node.js 和 postgres 听【英文标题】:Node.js and postgres LISTEN 【发布时间】:2013-10-21 11:40:09 【问题描述】:我想使用 Heroku、PostgreSQL 和 Node.js,并对其进行设置,以便每当我在我的 postgres 数据库中添加记录时,Node.js 都会将该行的内容打印到控制台。
我正在尝试按照以下说明进行设置: http://lheurt.blogspot.com/2011/11/listen-to-postgresql-inserts-with.html http://bjorngylling.com/2011-04-13/postgres-listen-notify-with-node-js.html
这里是 node.js 代码
var pg = require('pg');
conString = '/*my database connection*/';
var client = new pg.Client(conString);
client.connect(function(err)
if(err)
return console.error('could not connect to postgres', err);
client.connect();
client.query('LISTEN "loc_update"');
client.on('notification', function(data)
console.log(data.payload);
);
);
这是在postgres数据库上执行的函数
String function = "CREATE FUNCTION notify_trigger() RETURNS trigger AS $$ "
+ "DECLARE "
+ "BEGIN "
+ "PERFORM pg_notify('loc_update', TG_TABLE_NAME || ',longitude,' || NEW.longitude || ',latitude,' || NEW.latitude );"
+ "RETURN new;"
+ "END;"
+ "$$ LANGUAGE plpgsql;";
String trigger = "CREATE TRIGGER location_update AFTER INSERT ON device "
+ "FOR EACH ROW EXECUTE PROCEDURE notify_trigger();";
上传到 Heroku 后,我收到此错误。我做错了什么?
2013-10-13T22:40:21.470310+00:00 heroku[web.1]: Starting process with command `node web.js`
2013-10-13T22:40:23.697134+00:00 app[web.1]:
2013-10-13T22:40:23.727555+00:00 app[web.1]: events.js:72
2013-10-13T22:40:23.727822+00:00 app[web.1]: throw er; // Unhandled 'error' event
2013-10-13T22:40:23.727822+00:00 app[web.1]: ^
2013-10-13T22:40:23.784576+00:00 app[web.1]: error: invalid frontend message type 0
2013-10-13T22:40:23.784576+00:00 app[web.1]: at p.parseE (/app/node_modules/pg/lib/connection.js:473:11)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at p.parseMessage (/app/node_modules/pg/lib/connection.js:348:17)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at Socket.<anonymous> (/app/node_modules/pg/lib/connection.js:84:22)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at Socket.EventEmitter.emit (events.js:117:20)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at Socket.<anonymous> (_stream_readable.js:746:14)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at Socket.EventEmitter.emit (events.js:92:17)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at emitReadable_ (_stream_readable.js:408:10)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at emitReadable (_stream_readable.js:404:5)
2013-10-13T22:40:23.784576+00:00 app[web.1]: at readableAddChunk (_stream_readable.js:165:9)
2013-10-13T22:40:23.784787+00:00 app[web.1]: at Socket.Readable.push (_stream_readable.js:127:10)
2013-10-13T22:40:25.128299+00:00 heroku[web.1]: Process exited with status 8
2013-10-13T22:40:25.133342+00:00 heroku[web.1]: State changed from starting to crashed
【问题讨论】:
请分享您的代码。 它在本地主机上工作吗?事件中的 72 是哪一行? 解决了吗?嗯……好久不见 似乎 postgres 数据库可能没有运行,但您可以随时挖掘代码库并探索...... 【参考方案1】:尝试重命名变量:
String function = "CREATE FUNCTION notify_trigger() RETURNS trigger AS $$ ";
到
String variableFunction = "CREATE FUNCTION notify_trigger() RETURNS trigger AS $$ ";
function 是一个保留字。
如果错误仍然存在,请尝试在 localhost 上模拟相同的环境。
【讨论】:
以上是关于Node.js 和 postgres 听的主要内容,如果未能解决你的问题,请参考以下文章
Node.js Sequelize UUID 主键 + Postgres
AWS:启动启动服务器(Node.js + Postgres)
使用 postgres 和 node js 在单个语句中执行多个查询