2016-06-07 7 views
0

Мне трудно понять, почему мой Node-Red Flow продолжает сбой с [RED] Исключением нечистоты. Похоже, что функциональный узел сбой, и мой код внутри функционального узла никогда не имеет возможности его поймать.Ошибка узла NodeRed - [красный] Исключение нечистоты:

У меня очень простой поток Node-Red, который выполняет библиотеку node.js IBMDB для вставки данных в мою базу данных. Чтобы использовать библиотеку IBMDB, мне пришлось добавить пакет в список пакетов в моем файле package.json. Мне также пришлось настроить глобальную переменную контекста в файле Bluemix-setings.js. Я назвал эту глобальную переменную окружения IBMDB, которая эквивалентна требованию. Как только это будет сделано, я смогу использовать библиотеку внутри функционального узла.

** Здесь я использую библиотеку IBM 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, но элементы данных в одном из полей - это нечисловое значение, в котором определение таблицы ожидает только числовое значение. Я вижу в журналах ошибок (console out) две строки.

  • Отображаемое сообщение об ошибке 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, но поскольку мои данные попадают в узел как массив элементов, которые необходимо отдельно вставить в базу данных, я боролся с тем, как я мог запускать несколько SQL-вставок в цикле for , Наверное, я мог бы сделать цикл в потоке, но я начал с этого пути, думая, что будет легче. Оглядываясь назад, я, вероятно, принял плохое решение. Снова .. СПАСИБО ВАС .. Ты спас день! –

ответ

0

Попробуйте обернуть вызов conn.querySync в свой собственный блок try/catch. Текущий блок выходит за пределы области действия, потому что вызов происходит в другой функции (тот, который передается в 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); 
}