Я использую стек 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;
Я занимаюсь этой проблемой пару дней, поэтому буду очень признателен за вашу помощь