>背景信息
- 我正在做一个带有Express项目的NodeJS。
- 我正在使用一些身份验证中间件,我们可以称之为
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
何时完成该检查。我试图逐步通过,并且在我正在使用的_modules之一中重置了某个地方,所以这不起作用。我目前不确定原因。
我可以通过在用户经过身份验证之前不显示链接来解决这个问题,然后不应该有任何重定向到登录并再次返回的情况,这意味着他们永远不会看到登录页面等,但这不是这个问题的正确解决方案,也不是我想要实现的解决方案。
我非常感谢任何帮助,如果需要,可以提供更多信息!
提前谢谢。
问题是重定向后,由于浏览器发出了遵循重定向的新请求,res
对象是一个完整的新对象。这就是为什么res.locals.downloadFile2
undefined
.
若要解决您的问题,您可以将代码res.local.downloadFile2 = true
替换为用于设置 cookie 的代码。Cookie 包含的信息将由浏览器存储在客户端,并在每次请求时发送到服务器。
例如,请参阅 cookie 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 })