我有一个程序,可以增加会话 cookie 上的请求并将其打印到控制台。最初,我试图弄清楚如何保存这些数据。登录几个地方后,我意识到数据正在保存/更改,尽管我有一个单独的变量来保存我认为的 req 成员对象的临时版本。 这段代码让我意识到,当我增加分配给它的变量时,实际对象正在发生变化:
recordRequest(req) {
const { ip } = req.info;
const { requestsPerSecond } = req.session;
if (req.originalUrl.split('/').filter(Boolean)[0] == 'www.example.com') {
requestsPerSecond[ip] = requestsPerSecond[ip] + 1 || 1;
}
console.log(req.session.requestsPerSecond);
}
我似乎无法在此处或 Mozilla 的文档中找到这是否是预期行为,这是否是我使用 const (可以改变成员变量)的结果,或者是否存在某种奇怪的错误正在发生。我在以较小的规模重现此示例时也遇到了麻烦,但我验证了函数中的任何进出都不会影响这部分代码。
它并没有破坏我的代码或任何东西(它实际上让我的生活更轻松),但我想了解为什么会发生这种情况!
我默认对象解构的工作原理与正常分配基本相同。考虑:
const req = {session: {requestsPerSecond: {"0.0.0.0": "foo"}}};
const requestsPerSecond = req.session.requestsPerSecond;
// updates to `requestsPerSecond` will also update `req`.
我不确定你可以使用解构来破坏分配,所以你必须使用正常的策略:
const requestsPerSecond = Object.assign({}, req.session.requestsPerSecond);
recordRequest(req) {
const { ip } = req.info;
const { requestsPerSecond: { ...requestsPerSecond } } = req.session;
if (req.originalUrl.split('/').filter(Boolean)[0] == 'www.example.com') {
requestsPerSecond[ip] = requestsPerSecond[ip] + 1 || 1;
}
console.log(req.session.requestsPerSecond);
}