在传递某些上下文时如何在expressjs中redirect?

我正在使用express来在node.js中创build一个web应用程序。 这是我所拥有的简化:

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中发送的数据不validation,我想传递一些额外的上下文到/页面。 我怎么能这样做? redirect似乎不允许任何一种额外的参数。

将数据传递给不同的路由有几种方法。 当然,最正确的答案是查询string。 你需要确保值正确encodeURIComponent和decodeURIComponent 。

 app.get('/category', function(req, res) { var string = encodeURIComponent('something that would break'); res.redirect('/?valid=' + string); }); 

您可以通过使用req.query获取参数来阻止您的其他路由。

 app.get('/', function(req, res) { var passedVariable = req.query.valid; // Do something with variable }); 

对于更dynamic的方式,您可以使用url核心模块为您生成查询string:

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

所以如果你想redirect所有的请求查询stringvariables,你可以简单地做

 res.redirect(url.format({ pathname:"/", query:req.query, }); }); 

如果你使用Node> = 7.x,你也可以使用querystring核心模块

 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); }); 

另一种方法是在会议中设置一些东西。 你可以阅读如何在这里设置 ,但设置和访问variables是这样的:

 app.get('/category', function(req, res) { req.session.valid = true; res.redirect('/'); }); 

后来redirect后…

 app.get('/', function(req, res) { var passedVariable = req.session.valid; req.session.valid = null; // resets session variable // Do something }); 

还有使用Express, req.flash的旧function的选项。 在较新版本的Express中这样做将需要您使用另一个库。 从本质上讲,它允许你设置variables,这些variables会在你下一次页面时显示和重置。 这对于向用户显示错误非常方便,但是默认情况下它又被删除了。 编辑: find一个库,增加了这个function。

希望这会给你一个大致的想法如何在Express应用程序中传递信息。

我发现在routeHandlers之间传递数据以使用next()的最简单的方法不需要混淆redirect或会话。 或者,你可以调用你的homeCtrl(req,res)而不是next() ,只传递reqres

 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); 

您可以通过查询string传递一小部分键/值对数据:

 res.redirect('/?error=denied'); 

主页上的JavaScript可以访问它并相应地调整其行为。

请注意,如果您不介意/category作为浏览器地址栏中的url,则可以直接进行渲染而不是redirect。 恕我直言,很多时候人们使用redirect,因为旧的Web框架直接反应困难,但它很容易expression:

 app.post('/category', function(req, res) { // Process the data received in req.body res.render('home.jade', {error: 'denied'}); }); 

正如@ Dropped.on.Caprica评论的那样,使用AJAX消除了URL变化的担忧。