вызывать лямбда-функцию из лямбда-функции неправильно - PullRequest
5 голосов
/ 12 марта 2020

Возникающие проблемы:

  • Когда система пытается вызвать дочернюю функцию из родительской функции, она пропускает (не вызывает) функцию, а также не дает никакого ответа или ошибки
  • Если дочерняя функция вызывается родителем успешно, то она не сможет получить / извлечь данные с помощью запроса select , как указано в child. js, хотя записи уже успешно вставлены в базу данных, но система не будет их получать / извлекать

Есть две лямбда-функции и из Родительская функция вызвана Дочерняя функция :

1) родительский. js включает родительская функция

2) дочерний. js включает дочерняя функция

  • В Родительская функция , система вставляет данные в MYSQL База данных .
  • В Дочерняя функция , система получает / выбирает вставленные выше данные из MYSQL базы данных .

код для функции SQL для получения данных a от MYSQL База данных

// Define Modules
const mysql = require('mysql');
const log4js = require('log4js');
const logger = log4js.getLogger('[ Activity: Default ]');

const connCreds = {
    host: process.env.SQL_HOST,
    user: process.env.SQL_USERNAME,
    password: process.env.SQL_PASSWORD,
    database: process.env.SQL_DATABASE,
    multipleStatements: true,
};
const pool = mysql.createPool(connCreds);

const sqlInjection = (query, params, callback) => {
    logger.info('Start: Executing MYSQL query');
    logger.info('No of connections: ', pool._allConnections.length);
    pool.getConnection(function(err,connection){
        if (err) {
            logger.error(err);
            return callback(err);
        }
        logger.info('connected as id ' + connection.threadId);


        // Executing Query
        connection.query(query, params,function(error,rows) {
            connection.release();
            if(!error) {
                logger.info('End: Executing MYSQL query');
                return callback(null, rows);
            }
            console.log(error);
            return callback(error);
        });
  });
}
module.exports = { sqlInjection };

Код для родителя. js

const async = require('async');
const log4js = require('log4js');
const AWS = require('aws-sdk');

//check for paths to use
const paths = require('../Config/paths');

// Define Layer CommonLibraries
const logsConfig = require(paths.layer_function_path_with_one_parent + 'CommonFunctions/logsConfig');
const sendResponse = require(paths.layer_function_path_with_one_parent + 'Helpers/sendResponse');

// Define Database Functions
const mysqliDB = require('../CommonLibraries/DBManager/mysqliDB');

// Additional Functionalities
const { getS3BucketLogs } = require('../CommonLibraries/CommonFunctions/common');

// Setting Up Logger
const logger = log4js.getLogger('[ Function: Parent ]');

const parentFunction = (event, context, next) => {
    context.callbackWaitsForEmptyEventLoop = false;

    let FunctionName = context.functionName;
    logger.info('Function Name: ', FunctionName);
    logger.info('Start: Request to Parent');

    let params = event;
    if (event.body) params = JSON.parse(event.body);

    logger.info('Payload: ', params);

    let event_id = Number(params.event_id) || '';
    if (!event_id) {
        logger.error('Event id required');
        logger.info('End: Request to Parent');
        let response = 'Event id required';
        let returnPayload = params;
        returnPayload['response'] = response;
        returnPayload['function'] = FunctionName;
        return getS3BucketLogs(returnPayload, null, next);
    }

    let organiser_id = Number(params.organiser_id) || '';
    if (!organiser_id) {
        logger.error('Organiser id required');
        logger.info('End: Request to Parent');
        let response = 'Organiser id required';
        let returnPayload = params;
        returnPayload['response'] = response;
        returnPayload['function'] = FunctionName;
        return getS3BucketLogs(returnPayload, null, next);
    }

    let data_id = Number(params.data_id) || '';
    if (!data_id) {
        logger.error('Data id required');
        logger.info('End: Request to Parent');
        let response = 'Data id required';
        let returnPayload = params;
        returnPayload['response'] = response;
        returnPayload['function'] = FunctionName;
        return getS3BucketLogs(returnPayload, null, next);
    }

    let is_now = true;
    if (!params.is_now) is_now = false;

    // Intialization of Variables
    let android_device_array = [], ios_device_array = [], ios = 0, android = 0, sent = 0, web = 0, webapp = 0;

    // Custom Temp Variable
    if (is_now) {
        async.autoInject({
            addQueue: (callback) => {
                let androidTokens = android_device_array.map(token => {
                    return [
                        token, 'android', andiPayload, event_id, organiser_id, data_id
                    ];
                });

                let iosTokens = ios_device_array.map(token => {
                    return [
                        token, 'ios', iosPayload, event_id, organiser_id, data_id
                    ];
                });

                let insertData = androidTokens.concat(iosTokens);

                let query = 'INSERT INTO notification_queue (device_token, device_type, notification_payload, event_id, organiser_id, notification_id) VALUES ?';
                let queryPayload = [insertData];
                mysqliDB.sqlInjection(query, queryPayload, (err, response) => {
                    if (err) callback(err);
                    console.log(response);
                    let query = `select * from notification_queue where event_id=? and organiser_id=? and notification_id=? ORDER BY id;`;
                    query += 'select COUNT(id) as count from notification_queue WHERE event_id=? and organiser_id=? and notification_id=?;';
                    let queryPayload = [event_id, organiser_id, data_id, event_id, organiser_id, data_id];
                    return mysqliDB.sqlInjection(query, queryPayload, callback);
                });
            },
        }, (err, data) => {
            if (err) {
                logger.error(err);
                logger.info('End: Request to Parent');
                let response = 'Something went worng';
                let payloadData = params;
                payloadData['response'] = response;
                payloadData['function'] = FunctionName;
                return next(null, sendResponse.responseFail(err));
                // return getS3BucketLogs(payloadData, null, next);
            }

            let invokePayload = {
                'notification': { web, sent, ios, android, organiser_id, event_id, data_id },
                'processed': 0,
                'invokeLimit': 2,
                'invokeOffset': 0,
            };

            let lambda = new AWS.Lambda({
                region: 'ap-south-1'
            });
            lambda.invoke({
                FunctionName: 'Child Function',
                Payload: JSON.stringify(invokePayload),
                // InvocationType: 'Event'
            }, function (err, results) {
                if (err) console.log('Error while invoking function: ', err);
                console.log('\nSuceessful Invoke, response: \n', results);
            });

            let resp = data || [];
            logger.info('End: Request to Parent');
            return next(null, sendResponse.responseSuccess(resp));
        });
    }
};

module.exports.parentFunction = parentFunction;

Код для ребенка. js

// Define Modules
const async = require('async');
const log4js = require('log4js');

const config = require('../Config/static_variables');

//check for paths to use
const paths = require('../Config/paths');

// Define Layer CommonLibraries
const logsConfig = require(paths.layer_function_path_with_one_parent + 'CommonFunctions/logsConfig');
const sendResponse = require(paths.layer_function_path_with_one_parent + 'Helpers/sendResponse');

// Define Database Functions
const mysqliDB = require('../CommonLibraries/DBManager/mysqliDB');

const childFunction = (event, context, next) => {
    context.callbackWaitsForEmptyEventLoop = false;

    let FunctionName = context.functionName;

    // Setting Up Logger
    const logger = log4js.getLogger(`[ Function: ${FunctionName}]`);

    let invokeStart = Date.now();
    let reinvoke = true;

    logger.debug('Function Name: ', FunctionName);
    logger.debug('Function invoke start @ ', new Date(invokeStart));

    let params = event;
    if (event.body) params = JSON.parse(event.body);

    let invokeLimit = params.invokeLimit;
    let invokeOffset = params.invokeOffset || 0;
    let { organiser_id, event_id, data_id } = params.notification;

    logger.debug('Payload: ', params);

    async.autoInject({
        getQueueData: (callback) => {
            let query = `select * from notification_queue where event_id=? and organiser_id=? and notification_id=? ORDER BY id LIMIT ${invokeLimit} OFFSET ${invokeOffset};`;
            query += 'select COUNT(id) as count from notification_queue WHERE event_id=? and organiser_id=? and notification_id=?;';
            let queryPayload = [event_id, organiser_id, data_id, event_id, organiser_id, data_id];
            return mysqliDB.sqlInjection(query, queryPayload, callback);
        },
    }, (error, data) => {
        if (error) {
            logger.error('Error while re invoking function ', error);
            return next(error);
        }
        console.log('Invoked Count: ', params.processed);
        console.log('isReInvoke: ', reinvoke);
        let resp = data;
        return next(null, sendResponse.responseSuccess(resp));
    });
};

module.exports.childFunction = childFunction;
...