Возникающие проблемы:
- Когда система пытается вызвать дочернюю функцию из родительской функции, она пропускает (не вызывает) функцию, а также не дает никакого ответа или ошибки
- Если дочерняя функция вызывается родителем успешно, то она не сможет получить / извлечь данные с помощью запроса 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;