使用send()、end() 或redirect() 将terminate a HTTP Cloud Function:
始终以 send()、redirect() 或 end() 结束 HTTP 函数。否则,您的函数可能会继续运行并被系统强制终止。
在您的示例中,您在每个子快照的 forEach 迭代中调用 res.status(200).send(data.val());,因此它只会有机会发送一个响应。
同样,因为你使用了child_added event listener,它会为指定路径上的每个孩子触发一次。
如果您需要一次响应所有查询数据,最好使用value event listener,它会在一个响应中从您的查询中检索所有数据:
exports.viewdata = functions.https.onRequest((req, res) => {
const userId = req.query.user;
admin.database().ref('users/' + userId)
.orderByKey()
.limitToLast(10)
.on('value', function(snapshot) {
res.status(200).send(snapshot.val());
});
});
但是,如果您打算分别为每个孩子构建响应,您可以使用 res.write() 将数据写入响应,然后最终使用 end() 发送:
exports.viewdata = functions.https.onRequest((req, res) => {
const userId = req.query.user;
admin.database().ref('users/' + userId)
.orderByKey()
.limitToLast(10)
.on('value', function(snapshot) {
snapshot.forEach(function(data) {
res.write(data.val());
});
res.status(200).end();
});
});
或者,您可以将它们添加到列表中,然后再将它们作为响应全部发回。不过,您在这里采用的方法完全取决于您的最终目标。
与您最初的问题无关,但为了完整起见,请参阅来自 cmets 的以下观察和旁注: