node.js - Firebase + Node:更新两个 ref 会导致 304 错误
问题描述
我拥有的是一个在调用时重置 ref 的函数。它仅在更新一个参考时有效。
这是该部分功能的代码:
if (streakVal !== 0) {
//reset
const uid = item.child('uid').val();
ref.child(uid).update({ streak: 0 }).catch(err => {
res.status(500).send(err);
});
}
我还想在数据库的不同部分更新另一个 ref。我已经将它包含在同一个函数中,因为唯一的区别是 ref 位置。该部分看起来像这样:
if (streakVal !== 0) {
//reset
const uid = item.child('uid').val();
ref.child(uid).update({ streak: 0 }).then(() => {
boardRef.child(uid).update({ score: 0 }).catch(err => {
res.status(500).send(err);
});
}).catch(err => {
res.status(500).send(err);
});
}
第一个片段有效。但是,第二个导致错误Function execution took 800 ms, finished with status code: 304
我想知道为什么会这样以及如何解决它。也许我没有正确构建它,因为我是 Node.js 的新手。我确信这是两个裁判的正确路径。这是完整的功能:
export const resetStreak = functions.https.onRequest((req, res) => {
const ref = db.ref('users');
const boardRef = db.ref('streakLeaderboard');
ref.once('value').then(snap => {
snap.forEach(item => {
const streakVal = item.child('streak').val();
const lastQuestTimestamp = item.child('lastQuest').val();
const today = new Date();
const d = new Date(lastQuestTimestamp);
if (sameDay(today, d) === false) {
if (streakVal !== 0) {
//reset
const uid = item.child('uid').val();
ref.child(uid).update({ streak: 0 }).then(() => {
boardRef.child(uid).update({ score: 0 }).catch(err => {
res.status(500).send(err);
});
}).catch(err => {
res.status(500).send(err);
});
}
}
})
}).catch(err => {
res.status(500).send(err);
});
谢谢!
解决方案
您应该Promise
在 HTTPS 函数 ( docs ) 中返回您的。你的代码应该变成:
export const resetStreak = functions.https.onRequest((req, res) => {
const ref = db.ref('users');
const boardRef = db.ref('streakLeaderboard');
return ref.once('value').then(snap => {
const promises = []
snap.forEach(item => {
const streakVal = item.child('streak').val();
const lastQuestTimestamp = item.child('lastQuest').val();
const today = new Date();
const d = new Date(lastQuestTimestamp);
if (sameDay(today, d) === false) {
if (streakVal !== 0) {
//reset
const uid = item.child('uid').val();
promises.push(ref.child(uid).update({ streak: 0 }).then(() => {
return boardRef.child(uid).update({ score: 0 });
}));
}
}
})
return Promise.all(promises);
}).then(() => {
res.sendStatus(200);
}).catch(err => {
res.status(500).send(err);
});
推荐阅读
- linux - 如何在不遗漏字符/字符串的情况下将整个代码回显到 .bashrc?
- php - 在单击按钮上使用 jquery 从 mysql 中获取数据
- android - dalvik 找不到方法,尽管它们存在于 classes.dex 中
- heroku - 在 Heroku 上部署 Next.js 应用程序时出现 npm 错误
- javascript - 如何根据当前组件隐藏/显示一个组件?
- android - 我可以删除哪些文件并且该项目仍然可以工作
- c++ - 使用带有 max_element 的 lamda 函数编译错误
- aframe - 如何从另一个文件运行 A-Frame 代码以防止混乱?
- swift - queryOrdered 并不总是以正确的顺序返回 tableViewCell 上的数据
- python-3.x - Pygit2:在如何处理所有 repo 分支中的所有提交方面需要帮助