gpt4 book ai didi

javascript - Express 3 的跨 session 问题

转载 作者:搜寻专家 更新时间:2023-10-31 22:50:39 25 4
gpt4 key购买 nike

我有一个非常奇怪的 session 问题 - 一些奇怪的跨 session 问题让我感到困惑。

基本上我有一个 express 3 应用程序,其中有 2 个看似无关的东西 - 一个是标准的联系表格,有人可以用它给我发电子邮件,另一个是对 mailchimp 的 API 调用,用于在他们下订单时添加订阅者.这是 2 个完全不同的调用/操作。

在我的联系表单的顶部,我检查了变量“error”,我可以在我的 Controller 代码中使用它来表达诸如“无效电子邮件”或其他错误消息之类的内容。我的联系表单有 2 个 Controller 操作 - 一个用于显示表单的 GET,一个用于提交并显示错误(如果有)的 POST。

问题是这样的 - 当我最初加载联系表时,我看到这条消息:“错误:someone@example.com 已经订阅了常规列表。单击此处更新您的个人资料。”这是一条 MailChimp 消息——不仅与进程无关,而且与我的 session 无关!如果回头客下单并已订阅,则可能会发生此错误。据我所知,我从来没有向他们展示过这条消息,实际上并没有存储它。所以我很困惑。

需要注意的一点是,订单部分是在从支付网关(因此不是常规 session 用户)接收到 xml 文件时从 Node 服务器调用的 - 所以可能有一些我不理解的 session 内部机制。

代码在下面,但这里是问题的摘要。没有用户 session 事件的 Node 服务器正在对 mailchimp 进行 API 调用以使用此 module 添加订阅者- 同一封电子邮件通常会被订阅两次,因此 mailchimp 会回复“已订阅”消息,我 **t 在 Express 的错误本地中存储或加载该消息。然后用户访问该站点,转到联系表单,该表单检查是否有来自该用户的任何错误消息,该用户试图提交缺少字段的表单 - 他们会看到 mailchimp 消息显示另一个人的电子邮件地址。

这是相关代码。

应用程序.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);

联系表格 Controller :

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">
...

订单表格 Controller (在成功订单时由支付网关 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
});

最佳答案

天哪,经过大量调试后我终于弄明白了。问题是双重的:

  • MailChimpAPI 模块有一个错误 - 当收到错误时,它会创建以下代码:

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

错误变量未声明,因此它会触发全局错误变量。

  • View 代码检查“错误”是否存在并打印它——那是我自己的变量。但显然在 Express 的内部机制中,它会检查全局错误变量。

似乎错误被作为 app.locals 变量处理,因此桥接了用户 session 。

我通过 a) 修补 MailChimp 帮助程序代码并提交错误报告和 b) 确保不再将“错误”用作 View 变量来修复它。

哇哦。

关于javascript - Express 3 的跨 session 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16701455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com