Как использовать маршрут проверки электронной почты Nodemailer в Angular, поскольку Node.js и Angular работают на разных локальных хостах? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь отправить подтверждение по электронной почте, чтобы пользователи могли подтвердить свою электронную почту.Через back-end и nodemailer пользователь получает электронное письмо сейчас.Но когда вы нажимаете на ссылку внутри письма, это показывает ошибку.Это потому, что Front-end является Angular и работает на localhost: 4200, а Node.js работает на localhost: 30000.Вот код:

 const body = {
            username: Helpers.firstUpper(value.username),
            email: Helpers.lowerCase(value.email),
            password: hash,
          };
          User.create(body)
            .then(user => {
              const token = jwt.sign({ data: user }, dbConfig.secret, {
                expiresIn: '5h'
              });
              res.cookie('auth', token);
              res
                .status(HttpStatus.CREATED)
                .json({ message: 'User created successfully', user, token });
                var emailtoken = new emailToken({ _userId: user._id, emailtoken: crypto.randomBytes(16).toString('hex') });
                emailtoken.save(function (err) {
                    if (err) { return res.status(500).send({ msg: err.message }); }
                    var transporter = nodemailer.createTransport({
                        service: 'Sendgrid',
                        auth: { api_key:'api key is here' }
                    });
                    var mailOptions = {
                        from: 'email@email.com',
                        to: user.email, subject: 'Account Verification Token',
                        text: 'Hello,\n\n' + 'Please verify your account by clicking the link: \nhttp:\/\/' + req.headers.host + '\/confirmation\/' + emailtoken.emailtoken
                    }

                    transporter.sendMail(mailOptions, function (err) {
                    })          
                })
            })
            .catch(err => {
                res
                    .status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .json({ message: 'Error occured' });
            });
          });
        },

Я нашел что-то подобное в ответах на другие вопросы:

res.setHeader('Access-Control-Allow-Origin', 'http://localhost:4200'); // Change this to your Angular 2 port number
    res.setHeader('Access-Control-Request-Method', '*');
    res.setHeader('Access-Control-Allow-Methods', 'POST');
    res.setHeader('Access-Control-Allow-Headers', '*');

Где мне реализовать этот код?Кроме того, что я должен добавить в угловую часть, чтобы ссылка для подтверждения внутри электронной почты работала, как и ожидалось?

1 Ответ

0 голосов
/ 16 декабря 2018

Я думаю, что лучшим способом было бы сохранить `FRONTEND_URI как конфигурацию / среду.

Другой способ - следовать этому ответу

ОднакоРешение, которое я считаю более подходящим, заключается в замене сценария следующим образом:

При нажатии на ссылку необходимо отправить запрос на ваш бэкэнд, где он активирует вашу электронную почту, а затем перенаправляет пользователя наURL внешнего интерфейса (скажем, хранится в конфигурации / среде).

Таким образом, угловой компонент (на который вы будете перенаправлять) будет отображать статическую страницу, просто указывая, была ли проверка успешной, и указывая любые ошибки в противном случае..

...