在一段时间后删除未经验证的Meteor用户?

时间:2014-11-19 05:19:02

标签: javascript meteor

我正在研究Meteor应用程序,我想要删除已过时的“创建新帐户”,然后“检查您的电子邮件以验证帐户”工作流程的应用程序。我希望用户使用电子邮件(不是用户名)注册并立即访问应用,验证电子邮件将会触发,然后他们可以在以后验证以获得完全访问权限。所以我会立即和永远地打电话给Accounts.createUser(只要他们的电子邮件尚未被拍摄。)

如何创建但从未验证的任何基于电子邮件的帐户“取出垃圾”?就像我想在3天后删除未经验证的帐户一样?

我能想到的唯一方法是在Meteor.setTimeout挂钩中执行一个非常长的Accounts.onCreateUser命令,检查帐户电子邮件是否在三天后被验证(BTW为259,200,000毫秒)。这有用吗?它会起作用吗? Meteor中有另一种方法可以做这样的事吗?这不依赖于用户操作。我不希望在用户登录时执行此操作,因为用户可能会创建一个包含错误电子邮件的帐户,然后再也不会再登录,但将来会锁定该电子邮件的未来用户。

Meteor是否有任何类型的“服务器规则”,每隔一段时间就会启动一次“服务器规则”来运行检查?喜欢设置某种夜间维护功能/例程?此外,是否可以删除这样的User?我正在阅读另一篇关于无法通过API删除用户的文章。我当然需要能够做到这一点,因为重点是让实际拥有该电子邮件的用户可以使用该电子邮件/帐户。

如果必须,我可以使用“强制验证”方法,但我看到其他网站正在执行上述操作,我更喜欢它。它在移动设备上也更加流畅。

编辑:我只是在查看Meteor文档并发送“验证电子邮件”需要userId,这意味着无论如何都必须创建用户 - Accounts.sendVerificationEmail(userId, [email])。所以我想无论用什么电子邮件坏的用户都可以创建。所以知道如何做到这一点会很高兴。

3 个答案:

答案 0 :(得分:2)

您可以使用带有Meteor.setInterval的简单cron。

我不建议将Meteor.setTimeoutonCreateUser挂钩一起使用。这是因为如果您的服务器重新启动/崩溃/您在这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))),

安装synced-cron

meteor add percolate:synced-cron

在服务器上,在cron.js

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();

在任务文件中的服务器上(此处为delete-unverifiedUsers.js)

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 }
      ]
    }
  }
}