подтверждение по электронной почте в node js - PullRequest
0 голосов
/ 03 августа 2020

Я пишу код подтверждения электронной почты в node js. Следуя подходу, я использую

  • Генерировать 5 di git случайное число
  • Сохранять данные пользователя (электронная почта, пароль и т.д. c) вместе с 5 di git случайным числом в база данных (mongodb)
  • отправить случайное число на адрес электронной почты.
  • применить setTimeout() метон ждать 20 минут для подтверждения адреса электронной почты
  • через 20 минут, если пользователь проверяет адрес тогда это нормально, в противном случае удалите пользовательские данные из базы данных.

, но этот код продолжает ждать 20 минут, пока не закончится период setTimeout. есть ли способ применить эту стратегию, не дожидаясь 20 минут? Я знаю, что это просто, но не могу разобраться. Ниже приведен код ...

const emailCode = Math.floor(Math.random()*90000)+10000;
    try
    {
        const user = new User({...req.body, emailCode});
        req.user = user;
        await user.save()
    }
    catch(err)
    {
        if(err.keyPattern)
        {
            res.status(409).send({err: "User Already Exists"})
        }
        else if(err.errors.email)
        {
            res.status(400).send({err: err.errors.email.message})
        }
        else if(err.errors.password)
        {
            res.status(400).send({err: err.errors.password.message})
        }
        res.status(400).send(err);
    }
    const transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: '',
            pass: ''
        }
    });
    const mailOptions = {
        from: '',
        to: req.body.email,
        subject: "Confirm Your Email Address",
        text: "Use the following 5 digit code to confirm your email address \n"+emailCode.toString()
    };
    try
    {
        const mail = await transporter.sendMail(mailOptions);
        console.log("here");
        await new Promise(resolve =>
        {
            setTimeout(resolve, 10000)
        })
        console.log("there");
        console.log(req.user.verify)
        if(!req.user.verify)
        {
            req.user.remove();
        }
    }
    catch(err)
    {
        res.send(err)
    }

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Мы можем использовать индексы TTL в MongoDB для выполнения этой задачи, предположим, что есть isVerified, который по умолчанию равен false и установлен на true, когда пользователь проверяет электронную почту

Итак, мы можно добавить индекс TTL, например

db.users.createIndex( {createdAt: 1}, {
    expireAfterSeconds: 20*60, // 20 minutes
    partialFilterExpression: {
        isVerified: false
    }
});

, здесь createdAt - это дата и время регистрации пользователя.

Индекс TTL автоматически удалит документ по истечении времени, если isVerified по-прежнему неверно

Для справки https://docs.mongodb.com/manual/core/index-ttl/

1 голос
/ 03 августа 2020

Сохранить срок действия кода подтверждения вместе с ним в базе данных. Затем, когда вы проверяете код, также убедитесь, что срок его действия не истек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...