Как вызвать другой процесс, когда AWS Context callbackWaitsForEmptyEventLoop = false - PullRequest
0 голосов
/ 09 апреля 2019

Здесь я использую лучший пример MongoDB с лямбда-примером 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 Ответ

0 голосов
/ 09 апреля 2019

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

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

sns.publish(params, function (err, data) {
   if (err) console.log(err, err.stack);
   else console.log(data);
   callback(null, result);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...