#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
в mongodb2. я предоставил этому пользователю оба разрешения