我正在使用Firebase实时数据库来存储React Native应用程序中的数据。我的应用程序基本上允许用户保留一个位置。如果用户没有及时到达,这个位置应该在10分钟后自动删除。所以,我想知道如何安排一个函数在创建一个保留实例后运行10分钟。我尝试过使用Cloud Functions和Pub/Sub,但找不到使用这些服务执行以下操作的方法。
代码:
exports.onCreateReservation = functions.database
.ref('/reservations/{id}')
.onCreate(async (snapshot) => {
const project = 'proj';
const location = 'us-central1';
const queue = 'cancel';
const userId = snapshot.key;
const tasksClient = new CloudTasksClient();
const queuePath = tasksClient.queuePath(project, location, queue);
const expirationAtSeconds = Date.now() + 1000;
const url = `https://${location}-${project}.cloudfunctions.net/cancelReservation`;
const task = {
httpRequest: {
httpMethod: 'POST',
url,
body: JSON.stringify({id: userId}),
headers: {
'Content-Type': 'application/json',
},
},
scheduleTime: {
expirationAtSeconds,
},
};
await tasksClient.createTask({
parent: queuePath,
task,
});
});
exports.cancelReservation = functions.https.onRequest(async (req, res) => {
const {id} = req.body;
try {
await admin.database().ref(`/reservations/${id}`).remove();
res.send(200);
} catch (err) {
console.error(err);
res.status(500).send(err);
}
});
在onCreateReservation函数执行后,我在函数日志中不断收到这个错误。它一直以状态"错误"结束
Error: 13 INTERNAL: Request message serialization failure: invalid encoding
没有内置的runAfter
触发器类型。
您可以定期安排一个函数,然后检查过期内容,也可以使用"云任务"来触发单个过期节点,正如Doug在他的博客文章《如何安排云函数在未来使用云任务运行》中所描述的那样(以构建Firestore文档TTL(。