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

use*_*057 14 node.js express

我正在尝试在expressJS版本4应用程序中实现登录功能.我需要确定用户是否在他可以执行某些操作之前登录.所以我有一个名为isLoggedIn的中间件,它只检查用户对象是否在会话中,如果没有,则用户被重定向到登录页面.用户成功登录后,必须将其重定向到原始URL.

 app.get('/someaction', isLoggedIn, 'actual function to be executed'); 
Run Code Online (Sandbox Code Playgroud)

现在在isLoggedIn方法中,我看到req.url和req.originalUrl包含请求的操作.但是,如果用户未登录,则在重定向到/ login页面时,req.url和req.originalUrl都具有"/ login"作为内容.根据我在这里阅读的内容,我可以覆盖req.url以进行内部路由.但在我的情况下,req.url和req.originalUrl都被"/ login"操作覆盖.我究竟做错了什么?

Mik*_* B. 7

从 Express.js文档

req.url不是原生 Express 属性,它继承自 Node 的http module

这个属性很像req.url; 但是,它保留了原始请求 URL,允许您req.url出于内部路由目的自由重写。例如,“挂载”功能app.use() 将重写req.url以剥离挂载点。

换句话说,req.url在内部路由期间可能会被覆盖,而req.originalUrl将保持不变。


dwh*_*ieb 4

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

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

  2. 将原始 URL 作为查询参数添加到请求中/login

看看这个答案: 如何在重定向 Express 4 之前找到原始请求路径