这是我的firebase实时数据库。
我想删除“完成”标签。但是代码正在删除所有用户。工作不正常。我哪里出错了。 我使用的代码
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: 'https://xxxx.firebaseio.com/'
});
/**
* @function HTTP trigger that, when triggered by a request, checks every message of the database to delete the expired ones.
* @type {HttpsFunction}
*/
exports.removeOldMessages = functions.https.onRequest((req, res) => {
const timeNow = Date.now();
const usersRef = admin.database().ref('/users');
usersRef.once('value', (snapshot) => {
snapshot.forEach((child) => {
if ((Number(child.val()['complete'])) <= timeNow) {
child.ref.set(null);
}
});
});
return res.status(200).end();
});
答案 0 :(得分:0)
上面André的评论向您展示了如何删除complete
节点,而不是其父节点。
但是,您的Cloud Function代码未考虑您需要等待异步任务的事实(对set(null)
的所有调用,这返回一个Promise,该Promise“在写入服务器时完成”)以完成操作,然后再发送回return res.status(200).end();
的响应。
如果您不这样做,则您的Cloud Function可能会在完成异步任务之前完成(并且某些complete
节点可能不会被删除)。您将在Firebase视频系列的前两个视频中找到有关“ JavaScript承诺”的一些详细说明:https://firebase.google.com/docs/functions/video-series/
因此,由于需要等待异步set()
任务返回的所有Promise解析,因此需要使用Promise.all
并按如下所示修改代码:
exports.removeOldMessages = functions.https.onRequest((req, res) => {
const timeNow = Date.now();
const usersRef = admin.database().ref('/users');
usersRef.once('value')
.then(snapshot => {
const promises = [];
snapshot.forEach((child) => {
if ((Number(child.val()['complete'])) <= timeNow) {
promises.push(child.ref.child('complete').set(null));
}
});
return Promise.all(promises);
})
.then(results => {
return res.status(200).end();
})
.catch(error => {
//Watch the official video https://www.youtube.com/watch?v=7IkUgCLr5oA
})
});