【发布时间】:2019-11-27 21:40:14
【问题描述】:
我有一个快速应用程序,我在其中设置请求超时,并在满足条件时清除另一条路由请求的超时。问题是我无法在会话中存储超时(这是正常的,因为它是一个函数,而不是你可以 JSON.stringify() 的东西)。
我尝试创建一个全局变量:让超时并将超时分配给变量,但这不会正常工作,因为我有多个用户。因此,每次另一个用户发送请求时,都会重新分配超时变量。
我想做的一个小例子:
const route1 = (req, res) => {
const timeout = setTimeout(() => {
// do something
}, 1000);
req.session.timeout = timeout; // I know this does not work, but it is an example of what I would like to do
};
const route2 = (req, res) => {
// if condition is met clear the above timeout for this user/session
clearTimeout(req.session.timeout); // I know this does not work, but it is an example of what I would like to do
};
我可以将每个超时都存储在一个对象中,并将 sessionId 作为键,但我不确定这是必要的和/或执行此类操作的正确方法。
【问题讨论】:
-
为什么不能使用会话?另外,超时应该是按用户还是全局应用?即一个用户可以启动计时器而另一个用户取消吗?
-
因为你不能在会话中存储对函数的引用(我不知道)。超时只是我有充分理由做的事情,用户无法控制。
-
是的,但它是一个整数值,它不是对函数本身的引用。我不明白为什么将值序列化到会话中会遇到问题。
-
我刚刚检查了节点中 setTimeout 的行为,你是对的 - 它的工作方式与浏览器中的不同。事实上,it worked 正如我们在 node.js 的早期版本中所描述的那样。目前,它返回一个表示计划计时器而不是其 ID 的对象。您可以创建一个全局数组来保存类似
{userId, setTimeoutResult}的内容,而不是序列化setTimeout结果并将其存储在会话中。然后你可以访问route2中的数组,找到给定的用户并清除存储的超时时间。 -
@Laurent 是的,抱歉,我错了。我应该先检查一下文档,有时候假设这些东西太容易了,因为它们的工作原理非常相似。
标签: javascript node.js express express-session