知道在Firebase列表中添加了哪些新用户,即使在重新启动后也是如此

如文档中所引用的,我将用户保存在列表中。 用户可以使用密码和Facebook提供者login。 (其他提供者可能晚点)

然后,我有一个nodejs应用程序,侦听用户列表,并在发生新项目时向我发送电子邮件。

使用firebase很容易,只需添加一个child_added事件侦听器。 但是,由于我的应用程序可能会重新启动更新/崩溃或任何其他原因,我不想每次重新启动应用程序时与每个用户的电子邮件。 所以我只保存用于发送电子邮件的最新userId。

var retrieveLatestAccountNotified = function () { ref.child("server-state").child("email-account").once("value", function (snapshot) { user = snapshot.val(); console.log("Latest User Id : " + user); fetchUser(user); //fakeUser(""); }, function (errorObject) { console.log("The read failed: " + errorObject.code); }); }; var fetchUser = function (latestUserId) { ref.child("users").orderByKey().startAt(latestUserId).on("child_added", function (snapshot, prevChildKey) { if (snapshot.key() !== latestUserId) { var newUser = snapshot.val(); console.log(newUser); sendEmail.newAccountEmail(ses, newUser, snapshot.key(), function (err, data) { if (err) throw err; console.log('Email sent:'); console.log(data); ref.child("server-state").child("email-account").set(snapshot.key()); }); } }, function (errorObject) { console.log("The read failed: " + errorObject.code); }); }; 

问题是FB根据所选提供程序生成不同的userIdtypes,所以我的机制将不起作用。

如何处理?

  • 创build用户时添加优先级=>尽可能多的客户端可以添加用户,这种机制必须在每个客户端实现中使用
  • 在每个用户中添加一个孩子(creation_date)=>在用户中添加额外的信息
  • 添加另一个列表,保存哪些用户已被通知=>要求在全部列表上循环

任何受过教育的提议都是受欢迎的!

用于此的常用方法接近您的#3:

添加另一个列表,保存哪些用户已被通知=>要求在全部列表上循环

通常,您会添加一个发送电子邮件通知的队列。 这个队列纯粹是为了发送通知,所以一旦完成,服务器就从中删除它。

最简单的forms是:

 ref.child('emailNotificationQueue').on('child_added', function(snapshot) { sendEmailToAnthony(snapshot.val(), function() { snapshot.ref().remove(); }); }); 

为了获得更好的可伸缩性和其他许多原因,您可能需要使用firebase队列 。 但这是一个(精美的)这样一个循环加强版本。

你可以采取两种方法来排队:

  1. 您的应用将新用户写入/users并将通知写入/emailNotificationQueue 。 这通常是有效的,但是如果恶意的客户端(或者编码错误)写一个而不是另一个,就会有一些令人讨厌的种族/错误情况。 虽然你可以防范这些,但有时会有一个更简单的方法。

  2. 您的应用程序将新用户写入/newUserQueue 。 服务器从那里读取它们,发送电子邮件并将它们添加到/users

您可以尝试在用户对象本身最后一次发送电子邮件时存储时间戳,并使用具有时间戳属性的子查询。 这种方法有一个问题,第一次它可能重新发送所有用户的邮件。

 var fetchUser = function (last_email_sent_ts) { // as email_sent_ts will only have valid value when email is sent // if we query by email_sent_ts equals to null shall return all the // values that are missed during the restart ref.child("users") .orderByChild("email_sent_ts") .equalTo(null) .on("child_added", success , error); function success(snapshot, prevChildKey) { var newUser = snapshot.val(); if (newUser.email_sent_ts === last_email_sent_ts) return; sendEmail.newAccountEmail(ses, newUser, snapshot.key(), emailCallback); function emailCallback(err, data) { if (err) throw err; var email_sent_ts = new Date().getTime(); ref.child("users") .child(snapshot.key()) .child('email_sent_ts').set(email_sent_ts); } } }