Не удается отправить данные в Firebase с помощью навыка Alexa, размещенного на AWS Lambda

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