#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);
});