在expressjs版本4中req.url和req.originalUrl之间的区别

时间:2014-07-07 15:05:16

标签: node.js express

我正在尝试在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”操作覆盖。我做错了什么?

2 个答案:

答案 0 :(得分:1)

问题是实际上有两个完全独立的请求进入您的服务器。对/login页面的请求对此之前客户端请求的页面一无所知。因此,当您重定向到/login页面时,您需要在某处保存有关最初请求的URL的信息。我知道2个解决方案:

  1. 使用会话状态进行一些奇特的工作,允许您将原始URL保存为变量,可能使用promises。

  2. 将原始网址作为查询参数添加到/login请求。

  3. 看看这个答案: 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则保持不变。