Облачная функция Firebase завершается с кодом состояния 304 - PullRequest
1 голос
/ 24 марта 2019

У меня проблемы с выяснением, почему следующая функция завершила работу с кодом состояния 304, а не с отправкой ответа 200.Документы обновляются по мере необходимости, но я хочу получить правильный код статуса.

const firestoreInstance = admin.firestore();

export async function onTwitchGiveawayPostback(req, res) {
    const reward = 1;

    const userName = await utils.getParameterByName('name', req.originalUrl);

    if (!userName) { throw new Error('User Display Name is not set on REQLoot :('); }

    const displayNameDocPath = firestoreInstance.collection('displayNames').doc(userName);

    return displayNameDocPath.get().then(snapshot => snapshot.data()).then(displayNameDocDetails => {
        if (!displayNameDocDetails) {
            res.status(200).send('User Display Name: ' + userName + ' is not set on REQLoot :(');
            return Promise.resolve('Ok');
        } else {
            const uid = displayNameDocDetails.uid;

            const staminaEntryDoc   = firestoreInstance.collection(utils.API_URLS.userStaminaBalanceSheet + '/' + uid + '/entries').doc();
            const userDocPath       = firestoreInstance.collection('users').doc(uid);

            const promises = [];
            promises.push(
                userDocPath.get(),
            );

            return Promise.all(promises).then((snapshots) => {
                return Promise.all(snapshots.map((doc) => {
                    return doc.data();
                })).then(data => {
                    const userDocDetails = data[0];

                    const serverTimestamp = admin.firestore.Timestamp.now();

                    const batch = firestoreInstance.batch();

                    const staminaBalanceSheetDescription = 'winner';
                    const staminaPrev = userDocDetails.stamina;
                    const staminaNew = staminaPrev + reward;

                    batch.update(userDocPath, {
                        stamina: staminaNew,
                        updatedAt: serverTimestamp,
                    });

                    // Update the User's stamina balance sheet
                    batch.set(staminaEntryDoc, {
                        description: staminaBalanceSheetDescription,
                        stamina: {
                            previous: staminaPrev,
                            new: staminaNew,
                        },
                        staminaAmount: reward,
                        updatedAt: serverTimestamp,
                    });

                    return batch.commit();
                })
                .then(() => {
                    res.status(200).send(userName + ' won some stamina!');
                })
                .catch((err) => {
                    console.error(err)
                    return err;
                });
            })
        }
    })
    .catch(err => console.log(err))
}

В других сообщениях упоминалось, что функция всегда должна возвращать Обещание, но я думаю, что я добавляла их при необходимости.Чего мне не хватает, что мешает нормальному ответу 200?

1 Ответ

1 голос
/ 25 марта 2019

Проблема была в CORS.

Функция выполняла и обновляла firestore, но возвращала код состояния 304 и не отправляла полезную нагрузку строки. Обновление функции следующей строкой:

res.set('Access-Control-Allow-Origin', '*');

Разрешено для кода состояния 200 и правильной строки, отправляемой по завершении.

...