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

标签 node.js express redirect download middleware

背景信息

  • 我正在开发一个 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/

相关文章:

android - 通过 http 将 JSONObject 从 android 应用程序发送到 node.js?

angularjs - 将 API 端点设为私有(private)

node.js - 错误 : "Could not connect to any servers in your MongoDB Atlas cluster"

javascript - 通过 Express 获取和传递图像时出现问题

javascript - 如何在函数内部使用分配的变量,

node.js - 如何在 Cloud Functions 中使用 Firebase 远程配置?

javascript - 页面重定向脚本给了我一个重定向循环

java - 网络文档的复杂检索

ruby-on-rails - Rails 3 - 使用 OmniAuth 设计 - 登录后重定向到/users/sign_in

Javascript 求和 foreach 内的目录大小