2016-06-07 12 views
0

Es fällt mir schwer zu verstehen, warum mein Node-Red Flow mit einer [RED] Uncaught Exception abstürzt. Es scheint fast, als würde der Funktionsknoten abstürzen und mein Code innerhalb des Funktionsknotens hat nie eine Chance, ihn zu fangen.NodeRed Function Node stürzt ab - [red] Uncaught Exception:

Ich habe einen sehr einfachen Node-Red-Flow, der eine IBMDB node.js-Bibliothek ausführt, um Daten in meine Datenbank einzufügen. Um die IBMDB-Bibliothek zu verwenden, musste ich das Paket zur Liste der Pakete in meiner packages.json-Datei hinzufügen. Ich musste auch eine globale Kontextvariable in der Bluemix-setings.js-Datei einrichten. Ich nannte diese globale Kontextvariable IBMDB, die der require-Anweisung entspricht. Sobald dies erledigt ist, kann ich die Bibliothek in einem Funktionsknoten verwenden.

** Hier ist die Node.js IBMDB-Bibliothek, die ich benutze. https://github.com/ibmdb/node-ibm_db

** Hier ist der Fluss Node-Red Flow

** Hier ist der Code innerhalb der Funktion.

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

Wenn ich dies mit einer gültigen SQL-Anweisung ausführen und alle Datentypen korrekt gesendet werden, erhalte ich keine Fehler. Funktioniert alles!!

*** Das Problem: Wenn ich einige Tests durchgeführt habe, um einen SQL-Fehler zu erzwingen, stürzt die Node-Red-Instanz ab. Ich erzwang den Fehler, indem ich eine gültige SQL-Anweisung sendete, aber die Datenelemente in einem der Felder sind ein nicht-numerischer Wert, wobei die Tabellendefinition nur numerische erwartet. Ich sehe in den Fehlerprotokollen (Konsole aus) zwei Zeilen.

  • Die Fehler SQL-Fehlermeldung angezeigt wird, ist genau das, was ich in meiner Anwendung erwartet hatte. Stattdessen stürzt die Anwendung einfach ab.

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

Einsicht auf, was sehr geschätzt würde wirklich geschieht. Ich frage mich, wenn ich diesen Code in einen benutzerdefinierten Knoten einfügen würde ich in der Lage, den Fehler zu fangen. Könnte dies eine Einschränkung der Verwendung des Funktionsknotens als Wrapper für meinen Code sein. ???? *

+0

Versuchen Sie, den 'conn.querySync'-Aufruf in seinen eigenen try/catch-Block zu schreiben. Der aktuelle Block liegt außerhalb des Gültigkeitsbereichs, da der Aufruf in einer anderen Funktion erfolgt (die in 'beginTransaction' übergeben wurde). Auch einen Grund, warum Sie Ihren eigenen rollen statt den bestehenden Knoten https://www.npmjs.com/package/node-red-contrib-db2? – hardillb

+0

DANKE .. !!!! Das hat funktioniert!!! - Ich habe etwas mit dem Knoten contrib-db2 experimentiert, aber da meine Daten als ein Array von Elementen in den Knoten gelangen, die einzeln in die Datenbank eingefügt werden müssen, hatte ich Probleme mit der Ausführung mehrerer SQL-Einfügungen in einer for-Schleife . Ich denke, ich hätte eine Schleife im Fluss machen können, aber ich begann diesen Weg und dachte, es wäre einfacher. Rückblickend habe ich wahrscheinlich eine schlechte Entscheidung getroffen. Wieder .. DANKE .. Du hast den Tag gerettet !! –

Antwort

0

Versuchen Sie, den conn.querySync-Aufruf in seinen eigenen try/catch-Block zu schreiben. Der aktuelle Block liegt außerhalb des Gültigkeitsbereichs, da der Aufruf in einer anderen Funktion erfolgt (die in beginTransaction übergeben wurde).

z.B.

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