2016-06-07 175 views
0

我很难理解为什么我的Node-Red Flow不断崩溃[RED] Uncaught Exception。它几乎看起来像是功能节点崩溃了,并且我的函数节点内的代码从来没有机会去捕捉它。NodeRed函数节点崩溃 - [红色]未捕获异常:

我有一个非常简单的Node-Red流程,它执行一个IBMDB node.js库来将数据插入到我的数据库中。为了使用IBMDB库,我必须将包添加到我的packages.json文件中的包列表中。我还必须在Bluemix-setings.js文件中设置全局上下文变量。我将这个全局上下文变量IBMDB命名为与require语句等效的变量。一旦完成,我可以使用函数节点内的库。

**以下是我正在使用的Node.js IBMDB库。 https://github.com/ibmdb/node-ibm_db

**这里是流 Node-Red Flow

**下面是函数内的代码。

try { 
context.global.ibmdb.open("DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;", function (err,conn) { 

    conn.beginTransaction(function (err) { 
    if (err) { 
     //could not begin a transaction for some reason. 
     console.log(err); 
     return conn.closeSync(); 
    } 

    for (i = 0; i < msg.payload.Readings.length; i++) 
    { 
     var result = conn.querySync("INSERT INTO db2.table (" + 
            "I_ID," + 
            "D_ID," + 
            "field1," + 
            "field2," + 
            "field3," + 
            "field4," + 
            "field5," + 
            "field6," + 
            "field7," + 
            "field8," + 
            "field9," + 
            "field10)" + 
            "values (" + 
            "1A," + 
            "'"+ msg.payload.field1 + "',"+ 
            "'" + JSON.stringify(msg.payload.Readings[i].field2) + "'," + 
            msg.payload.Readings[i].field3 + ","+ 
            msg.payload.Readings[i].field4 + ","+ 
            msg.payload.Readings[i].field5 + ","+ 
            msg.payload.Readings[i].field6 + ","+ 
            msg.payload.Readings[i].field7 + ","+ 
            msg.payload.Readings[i].field8 + ","+ 
            msg.payload.Readings[i].field9 + ","+ 
            msg.payload.Readings[i].field10 + ","+ 
            "'2016-05-31 22:28:51.000000'" + 
            ");"); 
    } 

    conn.commitTransaction(function (err) { 
     if (err) { 
     //error during commit 
     console.log("****ERROR: " + err); 
     node.error("**** ERROR: ", err); 
     //return conn.closeSync(); 
     } 

     //Close the connection 
     conn.closeSync(); 
    }); 
    }); 
}); 
} catch (e) { 
    node.error("**** ERROR: ", err); 
} 

当我跑这与有效的SQL语句,所有的数据类型正确发送,我没有得到任何错误。一切正常!

***问题:当我做了一些测试来强制SQL错误时,Node-Red实例崩溃。我通过发送一个有效的SQL语句来强制该错误,但其中一个字段中的数据元素是一个非数字值,其中表定义只期望数字。我在错误日志(控制台输出)中看到两行..

  • 显示的错误SQL错误消息正是我期望在我的应用程序中捕获的内容。相反,应用程序只是崩溃。

[red] Uncaught Exception: Error: [IBM][CLI Driver][DB2/LINUXX8664] SQL0103N The numeric literal "1A" is not valid. SQLSTATE=42604

上究竟发生什么事,将不胜感激任何了解。我想知道如果我把这个代码放在一个自定义的内置节点中,我能够发现错误。这可能是使用函数节点作为我的代码包装的限制。 ???? *

+0

尝试将'conn.querySync'调用包装在它自己的try/catch块中。当前块超出范围,因为调用发生在另一个函数中(传递给'beginTransaction'的函数)。还有什么原因是你自己而不是现有的节点https://www.npmjs.com/package/node-red-contrib-db2? – hardillb

+0

谢谢.. !!!!这工作! - 我做了一些关于contrib-db2节点的实验,但是由于我的数据作为需要单独插入到数据库中的元素数组进入节点,所以我一直在努力如何在for循环中运行多个SQL插入。我想我可以在流程中完成一个循环,但是我认为这会更容易。回想起来,我可能做出了一个糟糕的决定。再次..谢谢你..你保存了一天! –

回答

0

尝试在它自己的try/catch块中包装conn.querySync调用。当前块超出范围,因为该调用发生在另一个函数(传入beginTransaction的函数)中。

例如

try { 
context.global.ibmdb.open("DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;", function (err,conn) { 

    conn.beginTransaction(function (err) { 
    if (err) { 
     //could not begin a transaction for some reason. 
     console.log(err); 
     return conn.closeSync(); 
    } 

    for (i = 0; i < msg.payload.Readings.length; i++) 
    { 
     try { 
     var result = conn.querySync("INSERT INTO db2.table (" + 
            "I_ID," + 
            "D_ID," + 
            "field1," + 
            "field2," + 
            "field3," + 
            "field4," + 
            "field5," + 
            "field6," + 
            "field7," + 
            "field8," + 
            "field9," + 
            "field10)" + 
            "values (" + 
            "1A," + 
            "'"+ msg.payload.field1 + "',"+ 
            "'" + JSON.stringify(msg.payload.Readings[i].field2) + "'," + 
            msg.payload.Readings[i].field3 + ","+ 
            msg.payload.Readings[i].field4 + ","+ 
            msg.payload.Readings[i].field5 + ","+ 
            msg.payload.Readings[i].field6 + ","+ 
            msg.payload.Readings[i].field7 + ","+ 
            msg.payload.Readings[i].field8 + ","+ 
            msg.payload.Readings[i].field9 + ","+ 
            msg.payload.Readings[i].field10 + ","+ 
            "'2016-05-31 22:28:51.000000'" + 
            ");"); 
     } catch (excp) { 
     //do stuff 
     } 
    } 

    conn.commitTransaction(function (err) { 
     if (err) { 
     //error during commit 
     console.log("****ERROR: " + err); 
     node.error("**** ERROR: ", err); 
     //return conn.closeSync(); 
     } 

     //Close the connection 
     conn.closeSync(); 
    }); 
    }); 
}); 
} catch (e) { 
    node.error("**** ERROR: ", err); 
}