我有这段代码,接受路径“ / img”中的最后10个url请求,并将其放入数组中,然后有两个条件。如果数组长度已经是10,则删除一个,然后删除最后一个索引,并将新索引添加到列表的开头。如果URL的索引已在数组中,则删除该索引,这样我在此列表中就不会有重复的URL。这是代码:
let recentPaths = [];
app.use('/img', (req, res, next) => {
const index = recentPaths.indexOf(req.originalUrl);
if (recentPaths.length === 10) {
recentPaths.pop();
}
if (index !== -1) {
recentPaths.splice(index, 1);
}
recentPaths.unshift(req.originalUrl);
next();
});
,然后有这个get函数,在这里我要从该数组中获取数据。这是代码:
app.get('/stats/paths/recent' ,sendRecentPaths);
async function sendRecentPaths(req, res) {
res.json(recentPaths);
}
它正在工作,但是我的问题是,我可以在此get函数中执行第一段代码吗? 我的意思是,我可以在app.get()中使用app.use()吗?因为我希望将来自路径'/ img'的请求以数组的形式发送至路径'/ stats / paths / recent'。
答案 0 :(得分:1)
将app.use
放在app.get
中是不正确的,因为中间件应该定义一次,而不是在每个请求上都定义。
如果打算在同一请求内执行的中间件之间交换数据,则它们应通过response object进行通信:
res.locals
一个对象,它包含范围为 要求,因此仅适用于在 该请求/响应周期(如果有)。否则,此属性为 与app.locals相同。
此属性对于公开请求级别的信息很有用,例如 请求路径名称,经过身份验证的用户,用户设置等。
即可以将一个数组分配给res.locals.recentPaths
中间件并在另一个中间件中读取。这种情况的问题在于/img
和/stats/paths/recent
中间件不在同一请求中执行。
将数据存储到recentPaths
变量是不正确的,因为它在请求之间持久存在并且对于所有用户都是全局的。如果数据应该在请求之间持久存在并且特定于用户,则应该涉及会话管理,存储数据的更好位置是数据库,而不是变量。