我正在尝试在expressJS第4版应用程序中实现登录功能。我需要确定用户是否在他可以执行某些操作之前登录。所以我有一个名为isLoggedIn的中间件,它只检查用户对象是否在会话中,如果没有,则用户被重定向到登录页面。用户成功登录后,必须将其重定向到原始URL。
app.get('/someaction', isLoggedIn, 'actual function to be executed');
现在在isLoggedIn方法中,我看到req.url和req.originalUrl包含请求的操作。但是,如果用户未登录,则在重定向到/ login页面时,req.url和req.originalUrl都具有“/ login”作为内容。根据我的阅读here,我可以覆盖req.url以进行内部路由。但在我的情况下,req.url和req.originalUrl都被“/ login”操作覆盖。我做错了什么?
答案 0 :(得分:1)
问题是实际上有两个完全独立的请求进入您的服务器。对/login
页面的请求对此之前客户端请求的页面一无所知。因此,当您重定向到/login
页面时,您需要在某处保存有关最初请求的URL的信息。我知道2个解决方案:
使用会话状态进行一些奇特的工作,允许您将原始URL保存为变量,可能使用promises。
将原始网址作为查询参数添加到/login
请求。
看看这个答案: How do I find original request path before redirect Express 4
答案 1 :(得分:1)
从Express.js documentation:
req.url
不是本机Express属性,它是从以下属性继承而来的 节点的http
module。此属性非常类似于
req.url
;但是,它保留了原始的 请求网址,允许您免费重写内部的req.url
路由目的。例如,app.use()
的“安装”功能 将重写req.url
以剥离安装点。
换句话说,req.url
可能在内部路由过程中被覆盖,而req.originalUrl
则保持不变。