我打算制作监控系统(连接到数据库)。任何更改都由数据库中的触发器(通知)确定。
数据库事件表
id - >事件ID(作为AutoIncrement)
area_id - >区域ID
情况 - >究竟发生了什么(1 - 正常状态,2 - 异常,3 - 警报)
触发
CREATE TRIGGER trigger_notifaj
AFTER INSERT
ON notifaj
FOR EACH ROW
EXECUTE PROCEDURE fun_notifaj();
触发功能
CREATE OR REPLACE FUNCTION fun_notifaj()
RETURNS trigger AS
$BODY$
DECLARE
BEGIN
PERFORM pg_notify(
CAST('notifaj' AS text),
(
(NEW.id)::text || '|' ||
(NEW.area_id)::text || '|' ||
(NEW.situation)::text
));
return new;
END;
$BODY$
test.js
var app = require("express")();
var http = require('http').Server(app);
var io = require("socket.io")(http);
var pg = require ('pg');
var status = '';
app.get("/",function(req,res){
res.sendFile(__dirname + '/x.html');
});
pg.connect("postgres:x@localhost:5432/notifaje", function(err, client)
{
if(err)
console.log(err);
io.on('connection',function(socket)
{
console.log("A user is connected");
socket.on('disconnect', function()
{
console.log('user disconnected');
});
client.on('notification', function(msg)
{
console.log('St: ' + status)
if (msg.name === 'notification' && msg.channel === 'notifaj')
{
if(status != msg.payload)
{
console.log(msg.payload);
status = msg.payload;
add_status(status,function(res)
{
io.emit('refresh feed',status);
});
}
}
});
});
client.query("LISTEN notifaj");
});
var add_status = function (status,callback)
{
if(status)
{
callback(true);
}
else
{
callback(false);
return;
}
}
http.listen(3000,function(){
console.log("Listening on 3000");
});
x.html:
<html>
<head>
<title>Monitoring</title>
<script src="/socket.io/socket.io.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<script src = "http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script>
$(document).ready(function(){
var socket = io();
socket.on('refresh feed',function(msg){
$("#show_comments").append(msg + '<br /><br />');
});
});
</script>
</head>
<body>
<div id="area1" style="background-color:green;">Area1</div>
<div id="area2" style="background-color:green;">Area2</div>
<div id="area3" style="background-color:green;">Area3</div>
<div id="area4" style="background-color:green;">Area4</div>
<div id="area5" style="background-color:green;">Area5</div>
<div id="area6" style="background-color:green;">Area6</div>
</div>
</body>
</html>
应用基于以下教程:https://codeforgeek.com/2015/03/real-time-app-socket-io