我是Node / Express的新手。我看到GET params可以像这样捕获:
app.get('/log/:name', api.logfunc);
POST如此:
app.post('/log', ...
(在req.body中提供表单变量。)
我知道app.all,但有一种方法可以在使用app.all时获得GET和POST的所有变量吗? (我已经习惯了PHP中的$ _REQUEST!:)
THX,
答案 0 :(得分:21)
您正在处理三种不同的参数传递方法:
1)路径参数,当您在路径中使用冒号前缀组件或正则表达式捕获时,表示路由器在req.param
中捕获。这些可以出现在GET和POST请求中。
2)URL查询字符串参数,如果您使用req.query
中间件,将在express.query
中捕获。这些也可以出现在GET和POST请求中。
3)身体参数,如果您使用req.body
中间件,将在express.bodyParser
中捕获。这些只会出现在Content-Type
为“x-www-form-urlencoded”的POST请求中。
所以你需要做的是将所有三个对象(如果存在)合并为一个。这样做没有本地Object
方法,但有很多流行的解决方法。例如,underscore.js库定义了extend
函数,允许您编写
req.params=_.extend(req.params || {}, req.query || {}, req.body || {}).
如果您不想使用图书馆并希望以自己的方式扩展对象,请查看this blog post。
答案 1 :(得分:0)
Personnaly,我将req.params
,req.body
,req.query
合并到一个req.props
Object.assign()
:
你只需要在你的路线中写下这个:
app.all('/myroute/:myparam', (req, res, next) => {
// merge all req data in one
req.props = Object.assign(req.query, req.params, req.body);
// optional :
// delete req.query;
// delete req.params;
// delete req.body;
});
在ES5中:
app.all('/myroute/:myparam', function(req, res, next){
// merge all req data in one
req.props = {};
if(req.query) for (var attrname in req.query) { req.props[attrname] = req.query[attrname]; }
if(req.params) for (var attrname in req.params) { req.props[attrname] = req.params[attrname]; }
if(req.body) for (var attrname in req.body) { req.props[attrname] = req.body[attrname]; }
// optional :
// delete req.query;
// delete req.params;
// delete req.body;
});
现在,您可以在所有路线中轻松访问带有req.props
的GET,POST,PUT参数,如果您决定删除旧请求,请注意相似名称。
此外,您可以使用中间件/功能使其更有用。
有关Object.assign()
的更多信息:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign