我有这条路线,在用户填写联系表格后发送电子邮件。
var express = require('express');
var mailRouter = express.Router();
var Mailgun = require('mailgun-js');
var api_key = 'key-xxxxxxxxxxxx';
var domain = 'xxxxxxxxxxxxxxxxx.mailgun.org';
var router = function(){
mailRouter.route('/send')
.post(function(req, res){
console.log(req.body);
var body = req.body;
var mailgun = new Mailgun({apiKey: api_key, domain: domain});
var mailOptions = {
from: body.email,
to: 'wewe99@yopmail.com',
subject: 'Oxedio Inquiry',
text: 'Hi, I am ' + body.name + '. ' + body.message + '. You can contact me @ ' + body.phone
};
mailgun.messages().send(mailOptions, function(err, body){
if(err){
res.render('error', {error: err});
console.log(err);
} else{
res.render('success', {mail: body});
console.log(body);
};
});
});
return mailRouter;
};
module.exports = router;
这里的问题是,当用户点击提交按钮时,它将转到此路由,发送电子邮件/消息,然后当用户在此登录页面刷新时,将重新发送电子邮件/消息。任何人都可以给出如何解决这个问题的提示吗?我尝试过使用req.session.destoy(),但我认为我没有会话因此它不起作用。我也尝试了setTimeout然后在显示成功消息一段时间后重定向到主页,但我认为这不是一个好主意,因为用户仍然可以在那个时间点刷新页面。我想要的是,当用户刷新页面时,电子邮件只会发送一次。
答案 0 :(得分:0)
常见的解决方法是在操作完成后将用户重定向到其他URL。这样,如果他们重新加载页面,他们会重新加载新页面,而不是再次提交表单数据。
例如:
mailgun.messages().send(mailOptions, function(err, body){
if (err){
req.session.mailError = err;
} else{
req.session.mailError = false;
req.session.mailBody = body;
};
res.redirect('/thankyou');
});
您为/thankyou
声明了一条新路线:
mailRouter.get('/thankyou', function(req, res) {
if (req.session.mailError) {
res.render('error', { error: req.session.mailError });
} else {
res.render('success', { mail: req.session.mailBody });
}
});
这要求您使用会话,例如使用express-session
。如果你不这样做,你要么必须开始使用它们,要么找到另一种方法将错误/正文传播到“谢谢”页面(虽然除了会话之外没有很多其他选择)。
如果您确实不需要传递特定错误或正文,则可以创建两个单独的路由,这些路由将呈现一般错误或一般的“谢谢”消息,并重定向到相应的错误:
if (err) {
res.redirect('/mail-error');
} else {
res.redirect('/thankyou');
}
然后这些页面只显示一般信息。