与Express 3交叉会话问题

我有一个非常奇怪的会议问题 – 一些奇怪的跨会议问题让我感到困惑。

基本上我有一个快递3应用程序,其中有2个,看似不相关的东西 – 一个是有人可以用来给我发电子邮件的标准联系表格,另一个是在订购时添加订阅者的API调用。 这是两个完全不同的调用/操作。

在我的联系表单的顶部,我有一个variables“错误”的检查,我可以在我的控制器代码中使用,例如“无效的电子邮件”或其他错误消息。 我的联系表单有两个控制器操作 – 一个用于显示表单的GET和一个用于提交并显示错误的POST。

问题是这样的 – 当我最初加载联系表单时,我看到以下消息:“错误:someone@example.com已经订阅了列表General,点击此处更新您的configuration文件。 这是一个MailChimp消息 – 不仅与stream程无关,而且与我的会话无关! 如果返回的客户下订单并且他们已经订阅,则可能发生此错误。 我不会告诉他们这个消息,据我所知,实际上存储它。 所以我很困惑。

有一点需要注意的是,订单部分在从支付网关(不是常规会话用户)接收XML文件时从节点服务器调用 – 所以也许有一些会话内部我不理解。

代码如下,但这里是问题的总结。 没有用户会话激活的节点服务器正在对mailchimp进行API调用,以便使用此模块添加订户 – 通常,同一电子邮件将被订阅两次,因此mailchimp将回复“已订阅”消息, 不要在Express的错误本地存储或加载。 然后用户访问该网站,去联系表格,该表格检查是否有任何来自该用户的错误消息,试图提交带有缺less字段的表单 – 并且他们看到显示另一个人的电子邮件地址的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 }); 

哦,上帝,我调查了looooot后,我明白了。 这个问题是双重的:

  • MailChimpAPI模块有一个错误 – 当收到错误时,它创build这个代码:

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

错误var是未声明的,所以它是全局错误var。

  • 视图代码检查是否存在“错误”并打印它 – 这是我自己的variables。 但显然在Express的内部机制中检查全局错误var。

看来,错误正在作为一个app.localsvariables处理,因此桥接用户会话。

我正在通过以下方式修复它:修补MailChimp帮助程序代码并提交错误报告,并确保不再使用“错误”作为视图variables。

哇。