MongoDB и Firebase не работают с функцией AWS Lambda

#mongodb #firebase #aws-lambda #google-cloud-firestore #amazon-lex

#mongodb #firebase #aws-lambda #google-облако-firestore #amazon-lex

Вопрос:

Я создаю AWS Lex bot, используя функцию lambda, и пытаюсь подключить его к базе данных MongoDB Atlas с помощью «mongoose» и базе данных firebase с использованием «cloud firestore».Но данные не сохраняются в базе данных, и даже в cloud watch не выдается ошибка, и там не отображается ни одна консоль

Я запускаю следующую команду для развертывания лямбда-функции в AWS Lex bot в обоих случаях mongodb Atlas и Cloud Firestore:

$ aws lambda update-функция-код —функция-название Hotel-Booking-Agent —zip-файл fileb://index.zip

Ниже приведен код для подключения mongodb atlas к лямбда-функции

 'use strict';
var mongoose = require('mongoose');
var dbURI = "mongodb srv://author:******@cluster0-geoiq.mongodb.net/test?retryWrites=true";
mongoose.connect(dbURI, { useNewUrlParser: true })
    .catch((e) => {
        console.log("catch error: ", e)
    })
mongoose.connection.on('error', function (err) {//any error
    console.log('Mongoose connection error: ', err);
    process.exit(1);
})
mongoose.connection.on('connected', function () {//connected
    console.log("Mongoose is connected");
})

mongoose.connection.on('disconnected', function () {//disconnected
    console.log("Mongoose is disconnected");
    process.exit(1);
});
console.log("reach here")
var userSchema = new mongoose.Schema({
    "name": { type: String, required: true },
    "email": { type: String, required: true },
    "Detail": { type: String, required: true }
},
    {
        collection: "user1"
    });
exports.handler = (event, context, callback) => {

    try {
        console.log(`request received for userId=${event.userId}, intentName=${event.currentIntent.name}`);
        var slots = event.currentIntent.slots;
        var noOfPeople = slots.noOfPeople;
        var noOfRoom = slots.noOfRoom;
        var roomKind = slots.roomKind;
        var subject = slots.subject;
        var name = slots.name;
        var email = slots.email;
        switch (event.currentIntent.name) {
            case 'Hotel_Booking':
                var userModel = mongoose.model("user", userSchema);
                var newUser = new userModel({
                    "name": name,
                    "email": email,
                    'Detail': `You have booked ${noOfRoom} rooms for ${noOfPeople} people in ${roomKind} category`
                })
                 newUser.save((dataSaved) => {
                    console.log("datasaved", dataSaved)
                })
                context.succeed({
                    "dialogAction": {
                        "type": "Close",
                        "fulfillmentState": "Fulfilled",
                        "message": {
                            'contentType': 'PlainText',
                            'content': `Okay, ${name} I have book  ${noOfRoom} rooms for ${noOfPeople} people in ${roomKind} category`
                        }
                    }
                })
                break
                        default:

                context.succeed({

                    "dialogAction": {
                        "type": "Close",
                        "fulfillmentState": "Fulfilled",
                        "message": {
                            'contentType': 'PlainText',
                            'content': `Can't understand`
                        }
                    }
                })
        }
    }
    catch (err) {
        context.succeed(err);
    }
}; 
  

Данные должны быть сохранены в базе данных, как в коде.Также бот AWS Lex выдает ответ, как указано в функции lambda, но в базе данных MongoDB Atlas нет данных, отображаемых. Привязка базы данных mongodb Atlas

Вот код для подключения firestore к лямбда-функции

 'use strict';
var admin = require("firebase-admin");
var serviceAccount = require("./agent-e2634-firebase-adminsdk-0n8na-40c5078975.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://agent-e2634.firebaseio.com"
});
const db = admin.firestore();
exports.handler =  (event, context, callback) => {
    try {
        console.log(`request received for userId=${event.userId}, intentName=${event.currentIntent.name}`);
        var slots = event.currentIntent.slots;
        var noOfPeople = slots.noOfPeople;
        var noOfRoom = slots.noOfRoom;
        var roomKind = slots.roomKind;
        var subject = slots.subject;
        var name = slots.name;
        var email = slots.email;
        switch (event.currentIntent.name) {
            case 'Hotel_Booking':
                var docRef = db.collection('users').doc('info');

                var setAda = docRef.set({
                    'name': name,
                    'email': email,
                    'content': `Okay, ${name} I have book  ${noOfRoom} rooms for ${noOfPeople} people in ${roomKind} category`
                });
                db.collection('users').get()
                    .then((data) => {
                        context.succeed({
                            "dialogAction": {
                                "type": "Close",
                                "fulfillmentState": "Fulfilled",
                                "message": {
                                    'contentType': 'PlainText',
                                    'content': `Okay, ${name} I have book  ${noOfRoom} rooms for ${noOfPeople} people in ${roomKind} category`
                                }
                            }
                        })
                        console.log(doc.id, '=>', data);
                    })
                    .catch((err) => {
                        console.log('Error getting documents', err);
                    });
                break
                        default:

                context.succeed({

                    "dialogAction": {
                        "type": "Close",
                        "fulfillmentState": "Fulfilled",
                        "message": {
                            'contentType': 'PlainText',
                            'content': `Can't understand`
                        }
                    }
                })
        }
    }
    catch (err) {
        context.succeed(err);
    }
}
  

Когда я развертываю приведенный выше код, бот возвращает следующую ошибку:

Произошла ошибка: Неверный лямбда-ответ: Получен ответ с ошибкой от Lambda: необработанный

тот же код отлично работает без подключения к базе данных, и даже в облачном firestore не создается коллекция и документы.

Комментарии:

1. Убедитесь, что вы предоставили оба разрешения на чтение и запись при создании пользователя author в mongodb

2. я предоставил этому пользователю оба разрешения