2016-09-19 13 views
0

連絡フォームに記入した後にメールを送信するこのルートがあります。ここExpressで1回送信した後にデータを再送信しないようにする方法

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: '[email protected]', 
     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

アクションが完了したら、別の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を使用して、たとえば、セッションを使用する必要があります。そうしないと、それらを使用し始めるか、エラー/本文を「ありがとうございました」ページに伝える別の方法を見つける必要があります(セッションの他には他の多くの選択肢はありません)。

実際に特定のエラーまたは本文を渡す必要がない場合は、一般的なエラーまたは一般的な「ありがとう」メッセージを表示する2つの別々のルートを作成し、適切なものにリダイレクトできます:

if (err) { 
    res.redirect('/mail-error'); 
    } else { 
    res.redirect('/thankyou'); 
    } 

これらのページには一般的なメッセージが表示されます。

+0

それは未定義の 'mailError'プロパティを設定できません。 –

+0

@MixAustriaああ、申し訳ありませんが、あなたが[セッション](https://www.npmjs.com/package/express-session)を使用していると誤って判断しました。私はいくつかの情報を提供するために私の答えを編集します。 – robertklep

関連する問題