I am trying to implement Oracle database change notification in NodeJS.
Function subscribeTimesheetEvent is subscribing to the notification, and one of the inputs is the callback method. In my case it’s myCallback function. This function gets called and it works fine, except it doesn’t see executeQuery function imported from dbFunctions file. I have used this function at other place by importing from dbFunctions and it works fine. I suspect I am facing some scoping issues I am not well versed with, in the myCallback function.
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;
Debug Screenshot: executeQuery shows up as undefined.
Advertisement
Answer
Importing the whole file instead of destructuring solves the error. Not sure why though ..
Import Code:
const dbFunctions = require('../db/dbFunctions');
Call the function:
dbFunctions.executeQuery("select * from chatbot_msg where rowid = :rowid", [row.rowid]) .then(msg=>logger.log(logger.LOG_LEVEL.INFO, JSON.stringify(msg)));