背景信息
- 我正在开发一个 NodeJS w/Express 项目。
- 我正在使用一些身份验证中间件,我们可以称之为
isAuthenticated()
- 中间件只是保护带有护照等的某些路由。
- 我添加了一个文件下载链接,该链接在用户尚未经过身份验证时可见。 (即按钮是公开可见的)。
- 如果您点击该按钮,下载路径将受到保护,因此我们会将您重定向至登录页面。
问题
- 用户通过身份验证后,我将调用
res.download(file);
。下载工作正常,但用户仍处于登录页面并输入了凭据。(注意:用户已通过身份验证,但此路由上没有发生进一步的重定向)。如果我尝试res.download(file)
,然后调用res.redirect('/')
,则不会下载该文件。
基本上:我想将用户重定向到 'website.com/'
的主页,但我采取的方法没有奏效。
主要方法:
- 在
router.get('/download/file2')
路由中设置res.local.downloadFile2 = true
。然后使用res.redirect('/')
重定向到主页。现在,在主页路由中,我只需在再次渲染主页后执行以下操作。
if (res.locals.downloadFile2 === true) {
res.download(file2)
}
但是:当检查完成时,res.locals.downloadFile2 === undefined
。我尝试单步执行,但它在我正在使用的模块之一中被重置,所以这不起作用。我目前不确定原因。
我可能可以通过在用户经过身份验证之前不显示链接来解决此问题,然后不应该出现任何重定向到登录并再次返回的情况,这意味着他们永远不会看到登录页面等。但这不是解决此问题的正确解决方案,也不是我想要实现的解决方案。
我非常感谢任何帮助,并且可以根据需要提供更多信息!
提前致谢。
最佳答案
问题是,重定向后,由于浏览器发出了新的请求来遵循重定向,因此 res
对象是一个完整的新对象。这就是为什么 res.locals.downloadFile2
是 未定义
。
要解决您的问题,您可以将代码 res.local.downloadFile2 = true
替换为设置 cookie 的代码。 cookie 保存的信息将由浏览器存储在客户端并随每个请求发送到服务器。
参见cookies npm 包例如:
var Cookies = require('cookies');
var cookies = new Cookies(req, res, { keys: ['arbitrary string to encrypt the cookie'] })
// get value of the cookie
var need_to_download_file = cookies.get('need_to_download_file', { signed: true })
// Logic to download file (if necessary)
if (need_to_download_file) {
// Trigger download of the file
// Reset cookie
cookies.set('need_to_download_file', false, { signed: true })
}
// set the cookie
cookies.set('need_to_download_file', true, { signed: true })
关于node.js - 如何在 res.redirect ('/' )之后执行操作或发送信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59364059/