我正在使用express在node.js中制作一个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
中发送的数据没有验证,我想向/
页面传递一些额外的上下文。我怎么能这样做呢?重定向似乎不允许任何类型的额外参数。
发布于 2013-09-27 04:26:54
有几种方法可以将数据传递到不同的路由。当然,最正确的答案是查询字符串。您需要确保这些值是正确的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
});
对于更动态的方式,您可以使用url
核心模块为您生成查询字符串:
const url = require('url');
app.get('/category', function(req, res) {
res.redirect(url.format({
pathname:"/",
query: {
"a": 1,
"b": 2,
"valid":"your string here"
}
}));
});
因此,如果要重定向所有请求查询字符串变量,只需执行以下操作
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);
});
另一种方法是在会话中设置一些内容。You can read how to set it up here,但设置和访问变量的方法如下:
app.get('/category', function(req, res) {
req.session.valid = true;
res.redirect('/');
});
后来在重定向之后...
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应用程序中传递信息有一个大致的了解。
发布于 2014-07-01 23:05:32
我找到的在routeHandlers之间传递数据的最简单的方法是使用next()
,不需要处理重定向或会话。或者,您可以只调用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);
发布于 2019-11-21 12:03:27
使用app.set和app.get
设置数据
router.get(
"/facebook/callback",
passport.authenticate("facebook"),
(req, res) => {
req.app.set('user', res.req.user)
return res.redirect("/sign");
}
);
获取数据
router.get("/sign", (req, res) => {
console.log('sign', req.app.get('user'))
});
https://stackoverflow.com/questions/19035373
复制相似问题