Мне трудно понять, почему мой 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
** Вот код внутри функции.
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
Любое представление о том, что на самом деле происходит было бы весьма признателен. Мне интересно, могу ли я поместить этот код внутри настраиваемого узла, я смогу уловить ошибку. Это может быть ограничение использования функционального узла в качестве оболочки для моего кода. ???? *
Попробуйте обернуть вызов 'conn.querySync' в свой собственный блок try/catch. Текущий блок выходит за пределы области действия, потому что вызов происходит в другой функции (тот, который передается в 'beginTransaction'). Также по какой-либо причине вы откатываете свой собственный, а не существующий узел https://www.npmjs.com/package/node-red-contrib-db2? – hardillb
СПАСИБО ВАС .. !!!! Это сработало !!! - Я немного экспериментировал с узлом contrib-db2, но поскольку мои данные попадают в узел как массив элементов, которые необходимо отдельно вставить в базу данных, я боролся с тем, как я мог запускать несколько SQL-вставок в цикле for , Наверное, я мог бы сделать цикл в потоке, но я начал с этого пути, думая, что будет легче. Оглядываясь назад, я, вероятно, принял плохое решение. Снова .. СПАСИБО ВАС .. Ты спас день! –