Тайм-аут функции AWS Lambda при добавлении записи в firebase

У меня возникли проблемы с сохранением данных в базе данных firebase с помощью лямбда-функции. Время истекло. Я попытался установить тайм-аут до 5 минут, что в идеале не должно выполняться, но все же истекает.

'use strict';

var firebase = require('firebase');

exports.handler = (event, context, callback) => {

    console.log(context);

    var params = JSON.stringify(event);

    var config = {
    apiKey: "SECRETAPIKEY",
    authDomain: "myapplication.firebaseapp.com",
    databaseURL: "https://myapplication.firebaseio.com",
    storageBucket: "myapplication.appspot.com",
    messagingSenderId: "102938102938123"
    };

    if(firebase.apps.length === 0) {   // <---Important!!! In lambda, it will cause double initialization.
        firebase.initializeApp(config);
    }

    var db = firebase.database();

    var postData = {
    username: "test",
    email: "[email protected]"
    };

    // Get a key for a new Post.
    var newPostKey = firebase.database().ref().child('posts').push().key;

    // Write the new post's data simultaneously in the posts list and the user's post list.
    var updates = {};
    updates['/posts/' + newPostKey] = postData;

    callback(null, {"Hello": firebase.database().ref().update(updates)}); // SUCCESS with message
};

Приведенный выше код сохраняет данные в firebase, но время ожидания истекает.

Если я использую context.callbackWaitsForEmptyEventLoop = false, как описано в Link Время ожидания не истекает, но данные не сохраняются.

Пожалуйста, дайте мне знать, как я могу решить эту проблему. В cloudwatch нет полезной информации.

Еще одна вещь: если я использую rest api для firebase для сохранения данных, он работает хорошо.


person prashant    schedule 20.01.2017    source источник
comment
Надеюсь, мой ответ здесь поможет stackoverflow.com/a/45266181/2073325   -  person gchao    schedule 23.07.2017


Ответы (1)


Проблема в том, что ваша функция обратного вызова

callback(null, {"Hello": firebase.database().ref().update(updates)}); // SUCCESS with message

вызывается до того, как Firebase сможет выполнить обновление.

Вместо вашего текущего обратного вызова вы должны поместить свою функцию обратного вызова в обратный вызов обновления Firebase:

firebase.database().ref().update(updates, function (err) {

    // your processing code here

    callback(null, {<data to send back>});
})
person solosodium    schedule 20.01.2017
comment
Это работает хорошо. В дополнение к этому мне пришлось добавить context.callbackWaitsForEmptyEventLoop = false; как первое утверждение - person prashant; 21.01.2017