5

私は非常に奇妙なセッションの問題を抱えています - 私を困惑させたいくつかの奇妙なクロスセッションの問題です。

基本的に私は Express 3 アプリを持っており、そこには一見関係のないように見える 2 つのものがあります。これらは 2 つの完全に異なる呼び出し/アクションです。

連絡先フォームの上部には、「無効な電子メール」やその他のエラー メッセージなどを伝えるためにコントローラー コードで使用できる変数「エラー」のチェックがあります。私の連絡先フォームには 2 つのコントローラー アクションがあります。1 つはフォームを表示する GET 用で、もう 1 つは送信してエラーがあれば表示する POST 用です。

問題は次のとおりです。最初に連絡フォームを読み込むと、次のメッセージが表示されます。これは MailChimp メッセージです - プロセスとは無関係であるだけでなく、私のセッションとは無関係です! このエラーは、リピーターの顧客が注文して注文し、すでに購読している場合に発生する可能性があります。私が知る限り、このメッセージを実際に保存せずに見せたことはありません。だから私は混乱しています。

注意すべきことの1つは、注文部分が支払いゲートウェイからxmlファイルを受信したときにノードサーバーから呼び出されることです(通常のセッションユーザーではないため)-おそらく、私が理解していないセッション内部がいくつかあります。

コードは以下にありますが、ここに問題の要約があります。ノードサーバーは、アクティブなユーザーセッションなしで、このモジュールを使用して購読者を追加するために mailchimp への API 呼び出しを行っています。Express のエラー ローカルに *t ストアまたはロードしないでください。次に、ユーザーはサイトにアクセスし、連絡先フォームに移動します。このフォームは、そのユーザーから、フィールドが欠落しているなどのエラーメッセージが送信されていないかどうかを確認します。また、別の人のメールアドレスを示す mailchimp メッセージが表示されます。

関連するコードは次のとおりです。

app.js:

var express = require("express"),
flash = require("connect-flash");

...

app.use(flash());

...

app.use(function(req, res, next) {
  var msgs;
  msgs = req.session.messages || [];
  res.locals.messages = msgs;
  res.locals.hasMessages = !!msgs.length;
  req.session.messages = [];
  return next();
});

...

app.get("/contact", express.csrf(), routes.main.contact);
app.post("/contact", express.csrf(), routes.main.submit);

お問い合わせフォームコントローラー:

exports.contact = function(req, res) {
    res.locals.token = req.session._csrf;
    res.render('main/contact');
};

exports.submit = function(req, res) {

  var send = function(message, fn) {
    var sendgrid = new SendGrid(settings.sendgrid_username, settings.sendgrid_password);
    sendgrid.send({
      to: settings.contact_email,
      from: message.email,
      subject: 'Contact Message',
      text: message.message
    }, fn);
  };

  var validate = function(message) {
    var v = new Validator(),
      errors = []
      ;

    v.error = function(msg) {
      errors.push(msg);
    };

    v.check(message.name, 'Please enter your name').len(1, 100);
    v.check(message.email, 'Please enter a valid email address').isEmail();
    v.check(message.message, 'Please enter a valid message').len(1, 1000);

    return errors;
  };

  function render() {
    res.locals.token = req.session._csrf;
    res.render('main/contact', locals);
  }

  var message = req.body.message,
    errors = validate(message),
    locals = {}
    ;

  if (errors.length === 0) {
    send(message, function(success) {
      if (!success) {
        locals.error = 'Error sending message';
        locals.message = message;
      } else {
        locals.notice = 'Your message has been sent.';
      }
      render();
    });
  } else {
    locals.error = 'Your message has errors:';
    locals.errors = errors;
    locals.message = message;
    render();
  }
};

お問い合わせフォーム:

{% if error or notice %}
<div id="message" class="alert alert-{% if error %}error{% else %}success{% endif %} ">
  <button type="button" class="close" data-dismiss="alert">×</button>
  <h4>{% if error %}{{ error }}{% else %}{{ notice }}{% endif %}</h4>
  {% if errors %}
  <ul>
  {% for e in errors %}
    <li>{{ e }}</li>
  {% endfor %}
  </ul>
  {% endif %}
</div>
{% endif %}

<form method="post">
...

注文フォーム コントローラー (注文が成功すると支払いゲートウェイ API によって呼び出されます。ユーザーが直接呼び出すことはありません)

var joinNewsletter = function(data) {

  try {
      var api = new MailChimpAPI(settings.mailchimp_api, { version : '1.3', secure : false });
      api.listSubscribe({
        id: settings.mailchimp_list_id,
        email_address: data.email,
        merge_vars: {
          fname: data.first,
          lname: data.last
        },
        double_optin: data.optin || false
      }, function() {});
  } catch (error) {
      console.log(error.message);
  }

};
...
 joinNewsletter({
    email: order.email,
    first: order.fname,
    last: order.lname
  });
4

1 に答える 1

2

なんてこった、デバッグをたくさんした後、私はそれを理解しました。問題は 2 つあります。

  • MailChimpAPI モジュールにはバグがあります。エラーを受信すると、次のコードが作成されます。

    error = new Error(message || (message = ''));

エラー var は宣言されていないため、グローバル エラー var にヒットしています。

  • ビューコードは、「エラー」が存在するかどうかを確認して出力します-それは私自身の変数でした。しかし、どうやら Express の内部メカニズムでは、グローバル エラー var をチェックします。

エラーが app.locals 変数として処理されているため、ユーザー セッションがブリッジされているようです。

a) MailChimp ヘルパー コードにパッチを適用してバグ レポートを提出し、b) 'error' をビュー変数として二度と使用しないようにすることで、この問題を修正しています。

うわー。

于 2013-05-29T23:00:08.340 に答える