如何在 res.redirect('/') 之后执行操作或发送信息?



>背景信息

  • 我正在做一个带有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.downloadFile2undefined.

若要解决您的问题,您可以将代码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 })

最新更新