【问题标题】:Firebase cloud function finishes with status code 304Firebase 云功能以状态码 304 结束
【发布时间】:2019-08-15 03:24:27
【问题描述】:

我无法找出为什么以下函数以 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))
}

其他帖子提到该函数总是需要返回一个 Promise,但我认为我已经在必要时添加了它们。我错过了什么阻止了正常的 200 响应?

【问题讨论】:

    标签: angular firebase promise google-cloud-firestore


    【解决方案1】:

    问题是 CORS。

    该函数正在执行和更新 firestore,但返回 304 状态代码并且未发送字符串有效负载。使用以下行更新函数:

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

    允许在完成时发送 200 状态代码和正确的字符串。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2021-10-26
      • 1970-01-01
      • 2017-08-26
      • 2021-10-22
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多