#amazon-web-services #firebase #firebase-realtime-database #aws-lambda #alexa-skills-kit
#amazon-веб-сервисы #firebase #firebase-база данных в реальном времени #aws-lambda #alexa-skills-kit
Вопрос:
У меня есть база данных в Firebase, в которую я пытаюсь записать некоторые данные с помощью моего навыка Alexa. The Node.js код для этого навыка находится внутри функции AWS Lambda, и когда этот код будет запущен, я хочу отправить некоторые данные в Firebase.
Я протестировал код, который подключается к Firebase и отправляет данные в Firebase за пределами Lambda, и он работает точно так, как ожидалось. Ниже приведен этот код:
var firebase = require('firebase');
firebase.initializeApp({
databaseURL: 'https://myapp.firebaseio.com',
serviceAccount: './myapp.json',
});
var cart = firebase.database().ref('/cart');
console.log(cart);
cart.push( {
item: 'apples', quantity: '1', amount: '0'
}, function(error) {
if (error) {
console.log("Data could not be saved." error);
} else {
console.log("Data saved successfully.");
}
});
Этот же код ничего не отправляет экземпляру базы данных при выполнении из лямбда-функции. Я прочитал в Интернете, что причиной этого может быть ограничение времени ожидания Lambda, поэтому я увеличил ограничение времени ожидания до минуты, и оно по-прежнему выполняется не так, как ожидалось. Я также пытался использовать Firebase REST API вместо их Node.js SDK, и это тоже не сработало. Как правильно отправлять данные в Firebase из AWS Lambda?
Комментарии:
1. Разрешены ли разрешения вашей базы данных для чтения / записи без проверки подлинности?
2. Разместили ли вы свою лямбда-функцию внутри вашего VPC?
3. Да, разрешения базы данных являются общедоступными. И я не думал, что мне нужно настраивать роль VPC, потому что я не пытаюсь получить доступ к ресурсам Amazon. Какую роль VPC мне нужно настроить?
4. Есть обновления? Я пытаюсь сделать то же самое.
Ответ №1:
Я думаю, что знаю, почему это происходит, у меня была похожая проблема, и это то, что я сделал.
Если вы хотите записать некоторую дату в свою базу данных, вам нужно убедиться, что вы не вызываете this.emit(*****), пока не закончите. Как только вы возвращаете ответ пользователю, поток закрывается, и ваша информация не сохраняется.
Самый простой способ решить эту проблему — вернуть ответ пользователю, как только вы получите подтверждение того, что информация была сохранена.
В случае Firebase что-то вроде этого:
function writeUserData(userId) {
// Get a key for a new Post.
var userKey = db.ref('users/').push().key;
var reference = db.ref('users/' userKey).set({
user: userId
});
reference.then(() => {
alexa.emit(':ask', "Works");
},
(err) => {
alexa.emit(':ask', "Does not work");
});
}
Я не мог ничего сохранить, пока не начал делать это таким образом.
Надеюсь, это поможет.
Ответ №2:
Я тоже сталкивался с этим, и единственный способ, которым я понял, как заставить это работать, — это отложить функцию обратного вызова lambda в обработчике. Попробуйте это и дайте мне знать, если это сработает.
var firebase = require('firebase');
firebase.initializeApp({
databaseURL: 'https://myapp.firebaseio.com',
serviceAccount: './myapp.json',
});
exports.handler = (event, context, callback) => {
var cart = firebase.database().ref('/cart');
console.log(cart);
cart.push( {
item: 'apples', quantity: '1', amount: '0'
setTimeout(()=>{
callback(null, 'success');
},2000);
}, function(error) {
if (error) {
console.log("Data could not be saved." error);
setTimeout(()=>{
callback(error);
},2000);
} else {
console.log("Data saved successfully.");
setTimeout(()=>{
callback(null, 'success');
},2000);
}
});
}