我正在研究Meteor应用程序,我想要删除已过时的“创建新帐户”,然后“检查您的电子邮件以验证帐户”工作流程的应用程序。我希望用户使用电子邮件(不是用户名)注册并立即访问应用,验证电子邮件将会触发,然后他们可以在以后验证以获得完全访问权限。所以我会立即和永远地打电话给Accounts.createUser
(只要他们的电子邮件尚未被拍摄。)
如何创建但从未验证的任何基于电子邮件的帐户“取出垃圾”?就像我想在3天后删除未经验证的帐户一样?
我能想到的唯一方法是在Meteor.setTimeout
挂钩中执行一个非常长的Accounts.onCreateUser
命令,检查帐户电子邮件是否在三天后被验证(BTW为259,200,000毫秒)。这有用吗?它会起作用吗? Meteor中有另一种方法可以做这样的事吗?这不依赖于用户操作。我不希望在用户登录时执行此操作,因为用户可能会创建一个包含错误电子邮件的帐户,然后再也不会再登录,但将来会锁定该电子邮件的未来用户。
Meteor是否有任何类型的“服务器规则”,每隔一段时间就会启动一次“服务器规则”来运行检查?喜欢设置某种夜间维护功能/例程?此外,是否可以删除这样的User
?我正在阅读另一篇关于无法通过API删除用户的文章。我当然需要能够做到这一点,因为重点是让实际拥有该电子邮件的用户可以使用该电子邮件/帐户。
如果必须,我可以使用“强制验证”方法,但我看到其他网站正在执行上述操作,我更喜欢它。它在移动设备上也更加流畅。
编辑:我只是在查看Meteor文档并发送“验证电子邮件”需要userId,这意味着无论如何都必须创建用户 -Accounts.sendVerificationEmail(userId, [email])
。所以我想无论用什么电子邮件坏的用户都可以创建。所以知道如何做到这一点会很高兴。
答案 0 :(得分:2)
您可以使用带有Meteor.setInterval
的简单cron。
我不建议将Meteor.setTimeout
与onCreateUser
挂钩一起使用。这是因为如果您的服务器重新启动/崩溃/您在这3天内更新代码,则代码段将无法运行。
服务器端代码:
Meteor.setInterval(function() {
// new Date must always be new Date()
var three_days_ago = new Date(new Date().getTime() - (3600000*72))
Meteor.users.find({
createdAt: {
$lte: three_days_ago //Users created less than 3 days ago
},
'emails.0.verified': false
}).forEach(function(user) {
//Do action with 'user' that has not verified email for 3 days
});
}, 3600000);
以上代码每小时运行一次,检查超过3天前(72小时)创建但尚未验证其首个电子邮件地址的用户。
答案 1 :(得分:1)
每天以cron工作方式混合和更新旧答案(@Akshat写new Date(new Date.getTime() - (3600000*72))
,但new Date(new Date().getTime() - (3600000*72))
),
meteor add percolate:synced-cron
import { SyncedCron } from 'meteor/percolate:synced-cron';
import { deleteUnverifiedUsers } from './delete-unverifiedUsers.js';
SyncedCron.config({ log: false, utc: true });
SyncedCron.add({
name: 'Check verified Users',
schedule(parser) {
//return parser.text('every 10 seconds');
//return parser.text('every 1 hour');
return parser.text('every 24 hours');
},
job() {
deleteUnverifiedUsers();
}
});
SyncedCron.start();
import { Meteor } from 'meteor/meteor';
// Set since variable in milliseconds*hours : ex 1h = 3600000*1
var one_day_ago = new Date(new Date().getTime() - (3600000*24))
Meteor.users.find({
// condition #1: users created since variable ago
createdAt: {
$lte: one_day_ago,
},
// condition #2: who have not verified their mail
'emails.0.verified': false
}).forEach(function(user) {
// Delete the users who match the 2 conditions
return Meteor.users.remove({_id: user._id})
});
答案 2 :(得分:0)
使用percolatestudio:synced-cron:
meteor add percolatestudio:synced-cron
然后在服务器上的Javascript中:
if (Meteor.isServer) {
Meteor.startup(function () {
SyncedCron.add({
name: 'Remove unverified users',
schedule: function(parser) {
// parser is a later.parse object
return parser.text('every Wednesday at 12am');
},
job: function() {
//TODO: implement RemoveUnverifiedUsers function
var numUsersRemoved = RemoveUnverifiedUsers();
return numUsersRemoved;
}
});
// start the cron daemon
SyncedCron.start();
}
}
编辑#1:
Meteor用户将在Meteor.users集合中有一个valid:false的电子邮件对象。 This part of the meteor docs提供了以下示例:
{
_id: "bbca5d6a-2156-41c4-89da-0329e8c99a4f", // Meteor.userId()
username: "cool_kid_13", // unique name
emails: [
// each email address can only belong to one user.
{ address: "cool@example.com", verified: true },
{ address: "another@different.com", verified: false }
],
createdAt: Wed Aug 21 2013 15:16:52 GMT-0700 (PDT),
profile: {
// The profile is writable by the user by default.
name: "Joe Schmoe"
},
services: {
facebook: {
id: "709050", // facebook id
accessToken: "AAACCgdX7G2...AbV9AZDZD"
},
resume: {
loginTokens: [
{ token: "97e8c205-c7e4-47c9-9bea-8e2ccc0694cd",
when: 1349761684048 }
]
}
}
}