当数据库中有事务时,我试图让客户端(浏览器)知道。
我在JS中使用EventSource与PostgreSQL连接,在那里我“监听”PostgreSQL DB。
所发生的是,EventSource每3-4秒监听或读取数据,即使我没有设置任何有关它的内容。
我的意图是,只有在DB 中有事务时,并且只有DB发出“通知”时,才会通知。
PROBLEM:EventSource每3-4秒监听一次,就像轮询一样,它会多次通知我,即使有一次来自DB的通知。
关注点:每当DB通过运行时,我都会连接它,这个SSE感觉就像是轮询。
JavaScript
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("sse.php");
source.onmessage = function(event) {
console.log(event.data);
};
} else {
console.log("SSE NOT SUPPORTED");
}PHP
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$conn = pg_pconnect("DB INFO HERE") or die('DB CONNECT ERROR');
pg_query($conn, 'LISTEN event_insert;');
$notify = pg_get_notify($conn);
if (!$notify) {
echo "data: .\n\n";
} else {
$msg = json_encode($notify);
echo "data: {$msg}\n\n";
}
flush();PostgreSQL
CREATE OR REPLACE FUNCTION notify_event_insert() RETURNS trigger AS $$
DECLARE
BEGIN
NOTIFY event_insert;
RETURN new;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_event_insert AFTER INSERT ON events
FOR EACH ROW EXECUTE PROCEDURE notify_event_insert();JS控制台
我明白了。当没有事务时,当有事务时,我得到JSON,而DB‘通知’me。

发布于 2020-09-23 16:23:31
https://stackoverflow.com/questions/64024309
复制相似问题