Serverless + Firebase: API не является ответным сообщением - PullRequest
0 голосов
/ 19 декабря 2018

Я создаю API, который будет обновлять базу данных Firebase Realtime, используя Nodejs, Serverless, Javascript.

мой файл .js:

var admin = require("firebase-admin");
var serviceAccount = require("../xxxxxxx-firebase-adminsdk-xxxxxxx.json");

module.exports.saveState = (event, context, callback) => {

    const body = JSON.parse(event.body);

    var timestamp_create = body.timestamp_create;

    try {
        admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),
            databaseURL: "https://xxxxxxx.firebaseio.com"
        });
    } catch (err) {
        console.log('Firebase initialization error', err.stack);
    }


    var db = admin.database();
    var ref = db.ref('item/');
    ref.child(timestamp_create).set({
        state: 'empty'
    }, function (error) {
        if (error) {
            console.log("Data could not be saved." + error);
        } else {
            console.log("Data saved successfully.");
            return callback(null, {
                headers: {
                    "Access-Control-Allow-Origin": "*",
                },
                statusCode: 200,
                body: JSON.stringify({ msg: "Data saved successfully." })
            });

        }
    });

};

Я развертываю API в AWS и тестируюна почтальоне:

Проблема и мои попытки:

  • После сохранения элемента в базе данных Firebase Realtime, API не ответил на сообщение.Api попал в тайм-аут.
  • Я проверил CloudWatch, журнал печатается ("Data saved successfully."), но он вообще не выполнял return callback.
  • Я пробовал api в "автономном режиме без сервера", он работает нормально и возвращает сообщение.

API не возвращает обратный вызов в среде AWS (лямбда).

Любое предложение приветствуется.

1 Ответ

0 голосов
/ 21 декабря 2018

После долгих гугл и тестирования я пришел к решению для этого, оставьте его здесь для справки:

Соединение с базой данных firebase не сбрасывается после сохранения данных, поэтому AWS Lambda не может вернуть обратный вызов.Простое решение - закрыть соединение с базой данных после задачи

var ref = db.ref('item/');
    ref.child(timestamp_create).set({
        state: 'empty'
    }, function (error) {
        if (error) {
            console.log("Data could not be saved." + error);
        } else {
            console.log("Data saved successfully.");

            db.gpOffline(); // this line will release database connection

            return callback(null, {
                headers: {
                    "Access-Control-Allow-Origin": "*",
                },
                statusCode: 200,
                body: JSON.stringify({ msg: "Data saved successfully." })
            });

        }
    });
...