首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在传递上下文的同时在expressjs中重定向?

如何在传递上下文的同时在expressjs中重定向?
EN

Stack Overflow用户
提问于 2013-09-27 02:00:42
回答 7查看 489.4K关注 0票数 325

我正在使用express在node.js中制作一个web应用程序。这是我所拥有的东西的简化:

代码语言:javascript
复制
var express = require('express');
var jade = require('jade');
var http = require("http");


var app = express();
var server = http.createServer(app);

app.get('/', function(req, res) {
    // Prepare the context
    res.render('home.jade', context);
});

app.post('/category', function(req, res) {
    // Process the data received in req.body
    res.redirect('/');
});

我的问题如下:

如果我发现在/category中发送的数据没有验证,我想向/页面传递一些额外的上下文。我怎么能这样做呢?重定向似乎不允许任何类型的额外参数。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-09-27 04:26:54

有几种方法可以将数据传递到不同的路由。当然,最正确的答案是查询字符串。您需要确保这些值是正确的encodeURIComponentdecodeURIComponent

代码语言:javascript
复制
app.get('/category', function(req, res) {
  var string = encodeURIComponent('something that would break');
  res.redirect('/?valid=' + string);
});

您可以通过使用req.query获取发送的参数,从而在您的另一个路由中截获这一点。

代码语言:javascript
复制
app.get('/', function(req, res) {
  var passedVariable = req.query.valid;
  // Do something with variable
});

对于更动态的方式,您可以使用url核心模块为您生成查询字符串:

代码语言:javascript
复制
const url = require('url');    
app.get('/category', function(req, res) {
    res.redirect(url.format({
       pathname:"/",
       query: {
          "a": 1,
          "b": 2,
          "valid":"your string here"
        }
     }));
 });

因此,如果要重定向所有请求查询字符串变量,只需执行以下操作

代码语言:javascript
复制
res.redirect(url.format({
       pathname:"/",
       query:req.query,
     });
 });

如果您使用的是Node >= 7.x,还可以使用querystring核心模块

代码语言:javascript
复制
const querystring = require('querystring');    
app.get('/category', function(req, res) {
      const query = querystring.stringify({
          "a": 1,
          "b": 2,
          "valid":"your string here"
      });
      res.redirect('/?' + query);
 });

另一种方法是在会话中设置一些内容。You can read how to set it up here,但设置和访问变量的方法如下:

代码语言:javascript
复制
app.get('/category', function(req, res) {
  req.session.valid = true;
  res.redirect('/');
});

后来在重定向之后...

代码语言:javascript
复制
app.get('/', function(req, res) {
  var passedVariable = req.session.valid;
  req.session.valid = null; // resets session variable
  // Do something
});

还有一种选择是使用Express的旧功能req.flash。在较新版本的Express中执行此操作将要求您使用其他库。本质上,它允许您设置变量,这些变量将在您下一次访问页面时显示并重置。它可以方便地向用户显示错误,但默认情况下,它已被删除。编辑:Found a library that adds this functionality.

希望这能让您对如何在Express应用程序中传递信息有一个大致的了解。

票数 444
EN

Stack Overflow用户

发布于 2014-07-01 23:05:32

我找到的在routeHandlers之间传递数据的最简单的方法是使用next(),不需要处理重定向或会话。或者,您可以只调用homeCtrl(req,res)而不是next(),并只传递reqres

代码语言:javascript
复制
var express  = require('express');
var jade     = require('jade');
var http     = require("http");


var app    = express();
var server = http.createServer(app);

/////////////
// Routing //
/////////////

// Move route middleware into named
// functions
function homeCtrl(req, res) {

    // Prepare the context
    var context = req.dataProcessed;
    res.render('home.jade', context);
}

function categoryCtrl(req, res, next) {

    // Process the data received in req.body
    // instead of res.redirect('/');
    req.dataProcessed = somethingYouDid;
    return next();
    // optionally - Same effect
    // accept no need to define homeCtrl
    // as the last piece of middleware
    // return homeCtrl(req, res, next);
}

app.get('/', homeCtrl);

app.post('/category', categoryCtrl, homeCtrl);
票数 49
EN

Stack Overflow用户

发布于 2019-11-21 12:03:27

使用app.set和app.get

设置数据

代码语言:javascript
复制
router.get(
  "/facebook/callback",
  passport.authenticate("facebook"),
  (req, res) => {
    req.app.set('user', res.req.user)
    return res.redirect("/sign");
  }
);

获取数据

代码语言:javascript
复制
router.get("/sign", (req, res) => {
  console.log('sign', req.app.get('user'))
});
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19035373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档