Подтверждение по электронной почте с помощью nodemailer не работает в производстве (Heroku) - PullRequest
1 голос
/ 27 апреля 2020

Я использую стек MERN и создал подтверждение по электронной почте для зарегистрированных пользователей. Все работает на localhost, но затем я пытаюсь подтвердить свою электронную почту в производственной среде, ничего не происходит. Кажется, что heroku не доходит до этой страницы, потому что console.log не отображается в журналах Heroku со страницы подтверждения. Вот мой сервер. js file

const express = require('express');
const connectDB = require('./config/db');
const compression = require('compression');
const enforce = require('express-sslify');

const app = express();
// Connect Database
connectDB();

// Init Middleware
app.use(express.json());

// Define Routes
app.use('/api/users', require('./routes/api/users'));
app.use('/api/confirmation', require('./routes/api/confirmation'));
app.use('/api/auth', require('./routes/api/auth'));

if (process.env.NODE_ENV === 'production') {
  app.use(compression());
  app.use(enforce.HTTPS({ trustProtoHeader: true }));
  app.use(express.static('client/build'));

  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
  });
}

const PORT = process.env.PORT || 4000;

app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

. В файле пользователя. js Я создаю пользователя и отправляю электронное письмо с идентификатором пользователя (идентификатор правильный, как в mongoDB) Это мой пользователь. js файл

router.post(
  '/',
  async (req, res) => {
    const { name, email, password, role } = req.body;
    try {
      let user = await User.findOne({ email });
      if (user) {
        return res
          .status(400)
          .json({ errors: [{ msg: 'User already exists' }] });
      }
      user = new User({
        name,
        email,
        avatar,
        password,
        role
      });
      const salt = await bcrypt.genSalt(10);
      user.password = await bcrypt.hash(password, salt);
      await user.save();
      let url = null;  
      if (process.env.NODE_ENV === 'production') {
        url = `https://myherokuapp/api/confirmation/${user.id}`
      } else {
        url = `http://localhost:4000/api/confirmation/${user.id}`
      }

      transporter.sendMail({
        to: email,
        subject: 'Confirm Email',
        html: `Please click this link to confirm your email: <a href="${url}">${url}</a>`,
      })
    } catch (err) {
      console.error(err.message);
      res.status(500).send('Server error');
    }
  }
);

Когда я открываю ссылку подтверждения из gmail, она переходит на - myherokuapp.com/api/confirmation/userId и перенаправляет на главную страницу - myherokuapp.com, но user.confirmed все тот же - false.

Это мое подтверждение. js file

const express = require('express');
const router = express.Router();

const User = require('../../models/User');

router.get('/:id', async (req, res) => {

  let userId = req.params.id;

  let conditions = {
    _id : userId
  }
  let update = {
    confirmed: true
  }
  try {
    const user = await User.findOneAndUpdate(conditions,update, {
      new: true
    });
  
      if(user.confirmed){
        if (process.env.NODE_ENV === 'production'){
          return res.redirect('https://myherokuapp.com')
          
        } else {
          return res.redirect('http://localhost:3000');
        }
      } else {
        console.log('error')
      }
    } catch (err){
      console.error(err.message);
      res.status(500).send('Server Error');
    }
   });
  
   module.exports = router;

Я занимаюсь этой проблемой пару дней, поэтому буду очень признателен за вашу помощь

...