Метод обратного вызова JavaScript не может вызвать функцию, импортированную из модуля

#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){...}