如何在Express中发送一次后防止重发数据

时间:2016-09-19 07:02:54

标签: javascript express mailgun

我有这条路线,在用户填写联系表格后发送电子邮件。

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然后在显示成功消息一段时间后重定向到主页,但我认为这不是一个好主意,因为用户仍然可以在那个时间点刷新页面。我想要的是,当用户刷新页面时,电子邮件只会发送一次。

1 个答案:

答案 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');
  }

然后这些页面只显示一般信息。