我正在尝试构建一个速率限制器,将时间戳保存到实时数据库并返回仅具有过去 60 秒值的对象以最终对它们进行计数,但是每次都会返回 null,我可以看到传递到的写入数据库,按照 Rate limiting for Google/Firebase cloud functions? 中的示例进行了几个小时的处理但没有任何运气。
exports.testRateLimiter =
functions.https.onRequest(async (req, res) => {
var ref = db.ref('rateLimiter/test');
var time = Date.now()
var timeStr = time.toString()
ref.push(timeStr)
var orderByVal = Date.now()-60000
var orderByValStr = orderByVal.toString()
ref.orderByKey().startAt(orderByValStr).once("value", function(snapshot) {
console.log(snapshot.val());
});
});
最佳答案
调用变量 orderByValStr
,建议您打算使用 orderByValue()
而不是 orderByKey()
。
如果您使用 Callable Cloud Functions for Firebase ,使用 async/await 语法是有意义的。但是对于 HTTP Events Cloud Functions for Firebase ,正如您在此处使用的那样,它们适合使用 Promises API。
exports.testRateLimiter =
functions.https.onRequest((req, res) => {
const ref = db.ref('rateLimiter/test');
const time = Date.now()
const timeStr = time.toString()
ref.push(timeStr)
const startTime = Date.now()-60000
ref.orderByValue().startAt(startTime).once("value")
.then(snapshot => {
console.log(snapshot.numChildren()); // log children instead
// do the thing
})
.catch(error => {
if (!res.headerSent) {
res.sendStatus(500);
}
console.log('Error: ', error);
});
});
我会考虑使用 firebase-functions-rate-limiter
因为它会为您处理清理工作。我建议查看它的 source code并从中学习你能学到什么。
关于javascript - 云函数速率限制器,不返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59850663/