私は非常に奇妙なセッションの問題を抱えています - 私を困惑させたいくつかの奇妙なクロスセッションの問題です。
基本的に私は 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
});