2016-05-08 10 views
2

Ich habe nodejs mit NVM installiert, um verschiedene Versionen verwenden zu können.Ereignisse abfangen firebird mit nodejs funktioniert nicht

Und dann installiert Firebird in Übereinstimmung mit these instructions.

Später folgte ich den Anweisungen auf der Unterseite von this tutorial, um Ereignisse abzufangen.

Im Grunde fügt es einen Trigger hinzu, der das "post_event" macht.

SQL> SET TERM !! ; 
SQL> CREATE TRIGGER new_employee_event FOR employee 
CON> ACTIVE 
CON> AFTER UPDATE 
CON> AS 
CON> BEGIN 
CON> POST_EVENT 'update_employee'; 
CON> END!! 
SQL> SET TERM ; !! 

Hier ist der Code, den ich für hören Ereignisse verwenden:

var fb = require("firebird"); 
var http=require('http'); 
var sys=require('sys'); 
var con = fb.createConnection(); 

con.connectSync('localhost:/var/lib/firebird/2.5/data/employee.fdb','sysdba','masterkey',''); 
con.addFBevent("update_employee"); 
con.on("fbevent",function(event,count){ 

    var rows = null; 
    rows = con.querySync("select * from EMPLOYEE WHERE EMP_NO = 145;").fetchSync(1,true); 
    con.commitSync(); 
    console.log("An Employee record has been updated"); 
    console.log(rows); 

}); 

WaitForFinish(function(){ return finished; }, 
    function(){ 
     con.disconnect(); 
     CleanUp(); 
     test.done(); 
    }, 20000); 

var finished = false; 

function WaitForFinish(finished,clean,timeout){ 
    var timedout = false; 
    var tid = setTimeout(function(){ 
    timedout = true; 
    },timeout); 
    process.nextTick(function loop(){ 
    if(finished.call()||timedout){ 
     clearTimeout(tid); 
     clean.call(); 
    } 
    else process.nextTick(loop); 
    }); 
} 

Und das ist der Code, den ich ein Ereignis zu erzeugen, verwenden.

var fb = require("firebird"); 
sys = require("sys"); 
var con = fb.createConnection(); 
con.connectSync('localhost:/var/lib/firebird/2.5/data/employee.fdb','SYSDBA','masterkey',''); 
con.querySync("UPDATE EMPLOYEE SET SALARY = 32004 WHERE EMP_NO = 145 "); 
con.commitSync(); 
var res = con.querySync("select * from EMPLOYEE WHERE EMP_NO = 145"); 
var rows = res.fetchSync("all",true); 
console.log(sys.inspect(rows)); 

Meine Knoten Version ist:

node -v 
v0.12.13 

Mein OS ist:

uname -r 
4.2.0-35-generic 

Das Problem ist, dass einfach nicht funktioniert. Kein Fehler.

Ich weiß nicht mehr zu tun. Ich muss Ereignisse für ein Projekt abfangen.

Antwort

1

In Firebird muss eine Verbindung ein Ereignis mit dem Namen abonnieren, kein Abonnement bedeutet keine Benachrichtigung. Sie registrieren sich für das Ereignis update_employee, während das Ereignis, das vom Auslöser gesendet wird, employee_updated lautet. Sie erhalten also nie eine Benachrichtigung, da kein Ereignis mit dem Namen update_employee vorliegt.

Sie müssen Ihren Code

con.addFBevent("employee_updated"); // <-- event name used in trigger 
con.on("fbevent", function(event,count){ 
    // ... your event handling 
}); 

Was sich ändern, wie ich von the documentation sagen kann, gibt es nur eine Event-Handler-Funktion, so dass, wenn Sie mehrere Ereignisse behandeln wollen, müssen Sie Logik hinzufügen auf event (das ist der Name des Ereignisses).

+0

Danke für die Beantwortung meiner Frage. Der Fehler, den Sie erwähnen, ist ein typischer Fehler beim Ausschneiden und Einfügen, als ich diesen Beitrag erstellt habe. Ich bearbeitet die Frage an jemand anderen nicht den gleichen Fehler zu beobachten. Vielen Dank. –

+0

@AlePaciotti also, haben Sie immer noch das Problem, auch nach dem Ändern des Ereignisnamens? –

+0

Ja @MarkRotteveel. Dasselbe Problem. –