使用nodejs捕获事件firebird不起作用

时间:2016-05-08 06:24:50

标签: node.js events ubuntu-14.04 firebird

我使用NVM安装了nodejs,以便能够使用不同的版本。

然后按照these instructions安装Firebird。

稍后我按照this tutorial底部的说明捕捉事件。

基本上它添加了一个触发器,使得" post_event"。

// loop through each available ID 
for(String ID : availableIdCollection){

    // print table headers here

    // loop through students array
    for(Student s : studentCollection){

        // print students data here
    }
}

以下是我用于侦听事件的代码:

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 ; !!

这是我用来生成事件的代码。

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);
  });
}

我的节点版本是:

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));

我的操作系统是:

node -v
v0.12.13

问题在于根本不起作用。没错。

我不知道该怎么做。我需要抓住项目的事件。

1 个答案:

答案 0 :(得分:1)

在Firebird中,连接需要按名称订阅事件,没有订阅意味着没有通知。您正在注册活动update_employee,而从触发器发布的活动是employee_updated。所以你永远不会收到通知,因为没有名称为update_employee的事件。

您需要将代码更改为

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

据我所知the documentation,只有一个事件处理函数,所以如果你想处理多个事件,你需要添加基于event的逻辑(这就是名字)事件)。