在传递某些上下文时如何在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()
,只传递req
和res
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变化的担忧。