Как вызвать другой процесс, когда AWS Context callbackWaitsForEmptyEventLoop = false

#mongodb #amazon-web-services #aws-lambda

#mongodb #amazon-веб-сервисы #aws-лямбда

Вопрос:

Я использую наилучшую практику MongoDB с примером Lambda отсюда https://docs.atlas.mongodb.com/best-practices-connecting-to-aws-lambda /

Мне нужно опубликовать в SNS, но я не могу этого сделать из-за callbackWaitsForEmptyEventLoop = false, если я раскомментирую это, он работает нормально, но тогда моя лямбда-функция просто истекает и никогда не получает успешного обратного вызова.

 "use strict";
const MongoClient = require('mongodb').MongoClient;
const MONGODB_URI = process.env.MONGODB_URI; // or Atlas connection string
const AWS = require('aws-sdk');
const SNS_TOPICARN = process.env.SNS_TOPICARN;
const sns = new AWS.SNS({ apiVersion: '2010-03-31' });

let cachedDb = null;

function connectToDatabase(uri) {
    console.log('=> connect to database');
    if (cachedDb) {
        console.log('=> using cached database instance');
        return Promise.resolve(cachedDb);
    }

    return MongoClient.connect(uri)
        .then(db => {
            cachedDb = db;
            return cachedDb;
        });
}

function queryDatabase(db) {
    console.log('=> query database');
    return db.collection('items').find({}).toArray()
        .then((data) => { return { statusCode: 200, data: data }; })
        .catch(err => {
            console.log('=> an error occurred: ', err);
            return { statusCode: 500, data: null };
        });
}

exports.handler = (event, context, callback) => {
    context.callbackWaitsForEmptyEventLoop = false;

    console.log('event: ', event);

    connectToDatabase(MONGODB_URI)
        .then(db => queryDatabase(db))
        .then(result => {
            console.log('=> returning result: ', result);

            var params = {
                Message: result.data,
                Subject: 'Devices Lost Connection',
                TopicArn: SNS_TOPICARN
            };
            sns.publish(params, function (err, data) {
                if (err) console.log(err, err.stack);
                else console.log(data);
            });

            callback(null, result);
        })
        .catch(err => {
            console.log('=> an error occurred: ', err);
            callback(err);
        });
};
  

Ответ №1:

Проблема решена, оставлю ее здесь, если у кого-то еще такая же проблема:

Мне нужно выполнить обратный вызов обработчика в обратном вызове второй функции:

 sns.publish(params, function (err, data) {
   if (err) console.log(err, err.stack);
   else console.log(data);
   callback(null, result);
});