#javascript #node.js #node-oracledb
#javascript #node.js #узел-oracledb
Вопрос:
Я пытаюсь реализовать уведомление об изменении базы данных Oracle в NodeJS.
Функция subscribeTimesheetEvent подписывается на уведомление, и одним из входных данных является метод обратного вызова. В моем случае это функция MyCallback. Эта функция вызывается и работает нормально, за исключением того, что она не видит функцию ExecuteQuery, импортированную из файла DbFunctions. Я использовал эту функцию в другом месте, импортировав из DbFunctions, и она работает нормально. Я подозреваю, что я сталкиваюсь с некоторыми проблемами, с которыми я не очень хорошо разбираюсь, в функции MyCallback.
const oracledb = require('oracledb');
const logger = require('../logger')
const common = require('../common');
let { executeQuery } = require('../db/dbFunctions');
const { getQueryObj, queries } = require('../db/queries')
require('dotenv').config();
function myCallback(message) {
logger.log(logger.LOG_LEVEL.INFO, JSON.stringify(message));
logger.log(logger.LOG_LEVEL.INFO, message.type);
if (message.type == oracledb.SUBSCR_EVENT_TYPE_DEREG) {
// clearInterval(interval);
logger.log(logger.LOG_LEVEL.INFO, "Deregistration has taken place...");
return;
}
message.tables.forEach(table => {
logger.log(logger.LOG_LEVEL.INFO, `--> --> Table Name: ${table.name}`);
// Note table.operation and row.operation are masks of
// oracledb.CQN_OPCODE_* values
logger.log(logger.LOG_LEVEL.INFO, `--> --> Table Operation: ${table.operation}`);
if (table.rows) {
logger.log(logger.LOG_LEVEL.INFO, `--> --> Table Rows: table.rows.length`);
table.rows.forEach(row => {
if(row.operation ==oracledb.CQN_OPCODE_INSERT ){
executeQuery("select * from chatbot_msg where rowid = :rowid", [row.rowid])
.then(msg=>logger.log(logger.LOG_LEVEL.INFO, JSON.stringify(msg)));
}
});
}
});
logger.log(logger.LOG_LEVEL.INFO, Array(61).join("="));
// }
}
async function subscribeTimesheetEvent() {
logger.log(logger.LOG_LEVEL.INFO, 'Registering Oracle Change Notification');
const connection = await oracledb.getConnection();
// await connection.unsubscribe('mysub');
const options = {
sql: `SELECT * FROM chatbot_msg`, // query of interest
callback: myCallback, // method called by notifications
qos: oracledb.SUBSCR_QOS_ROWIDS,
port: 9091,
timeout: 120,
operations: oracledb.CQN_OPCODE_INSERT
};
await connection.subscribe('tsMsgSub', options);
}
module.exports.subscribeTimesheetEvent = subscribeTimesheetEvent;
Скриншот отладки:
ExecuteQuery отображается как неопределенный.
Комментарии:
1. здесь немой вопрос, но вы убедитесь, что оператор if передается правильно?
2. Да, если оператор передается правильно.
Ответ №1:
Импорт всего файла вместо деструктурирования устраняет ошибку. Не уверен, почему..
Импорт кода:
const dbFunctions = require('../db/dbFunctions');
Вызов функции:
dbFunctions.executeQuery("select * from chatbot_msg where rowid = :rowid", [row.rowid])
.then(msg=>logger.log(logger.LOG_LEVEL.INFO, JSON.stringify(msg)));
Комментарии:
1. Это из-за того, как вы экспортируете. при использовании
module.exports
модуля находится файл. если вы хотите использовать деструктурирование, вам нужно будет экспортировать его как объект, например:module.exports = { queries: queryFunction, addQuery : addFunction }
или в файл, помещенныйexport
перед каждой функцией:export async function executeQuery(input){...}