Облачные функции для Firebase Не удалось обработать запрос после успешного запроса - PullRequest
0 голосов
/ 15 января 2019

TLDR: После записи JSON (успешно) в мой Firestore, следующий запрос выдаст мне Внутреннюю ошибку сервера (500). У меня есть подозрение, что проблема в том, что вставка еще не завершена.

В общем, у меня есть этот код:

const jsonToDb = express();
exports.jsondb = functions.region('europe-west1').https.onRequest(jsonToDb);
jsonToDb.post('', (req, res) => {
    let doc;
    try {
        doc = JSON.parse(req.body);
    } catch(error) {
        res.status(400).send(error.toString()).end();
        return;
    }
    myDbFuncs.saveMyDoc(doc);
    res.status(201).send("OK").end();
}

Функции базы данных находятся в другом файле JS.

module.exports.saveMyDoc = function (myDoc) {
    let newDoc = db.collection('insertedDocs').doc(new Date().toISOString());
    newDoc.set(myDoc).then().catch();
    return;
};

Итак, у меня есть несколько теорий, возможно, одна из них не ошибается, но, пожалуйста, помогите мне с этим. (Также, если я допустил некоторые ошибки в этом небольшом фрагменте, просто скажите мне.)

Размножение:

  1. Я отправляю первый запрос => все в порядке, Json в базе данных.

  2. Я отправляю второй запрос после того, как первый запрос дал мне статус OK => в течение нескольких секунд ничего не происходит, затем 500: Внутренняя ошибка сервера.

Журналы: выполнение функции заняло 4345 мс, завершено со статусом: «ошибка соединения».

Я просто не понимаю. Давайте представим, что я использую это как API, несколько запросов одновременно. Не может ли он справиться? (Я полагаю, что он может справиться, просто я делаю что-то глупое.) Умышленно, я отправляю второй запрос после того, как первый закончил, и это происходит. Должен ли я сделать асинхронное сохранение saveMyDoc?

1 Ответ

0 голосов
/ 15 января 2019

saveMyDoc не возвращает обещание, которое разрешается, когда вся асинхронная работа завершена. Если вы потеряете обещание, Cloud Functions остановит работу и произведет очистку до ее завершения, создавая впечатление, что она просто не работает. Вы должны отправлять ответ только через функцию типа HTTP после , когда вся работа полностью завершена.

Минимально, это должно выглядеть примерно так:

module.exports.saveMyDoc = function (myDoc) {
    let newDoc = db.collection('insertedDocs').doc(new Date().toISOString());
    return newDoc.set(myDoc);
};

Тогда вы бы использовали обещание в своей основной функции:

myDbFuncs.saveMyDoc(doc).then(() => {
    res.status(201).send("OK").end();
}

Посмотрите, как ответ отправляется только после сохранения данных.

Подробнее об асинхронном программировании в облачных функциях см. В документации . Также посмотрите этот видеоролик , в котором рассказывается о работе с обещаниями в облачных функциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...