Nodejs,Express GET POST PARAMS
我是Node / Express新手。我看到GET params可以像这样捕获:
app.get('/log/:name', api.logfunc);
发布像这样:
app.post('/log', ...
(在req.body中可用的表单variables)
我知道app.all,但有没有一种方法,我可以得到所有的variables为GET和POST时使用app.all? (我太习惯$ _REQUEST在PHP!:)
谢谢,
你正在处理三种不同的parameter passing方法:
1)path参数,当你在你的路由中使用冒号前缀组件或正则expression式捕获时,expression路由器在req.param
捕获的path参数。 这些可以出现在GET和POST请求中。
2)URL查询string参数,如果使用express.query
中间件,将会在req.query
捕获这些参数。 这些也可以出现在GET和POST请求中。
3)身体参数,如果您使用express.bodyParser
中间件,将会在req.body
捕获这些参数。 这些只会出现在具有“x-www-form-urlencoded” Content-Type
的POST请求中。
所以你需要做的是将所有三个对象(如果存在的话)合并成一个。 有没有本地的Object
方法来做到这一点,但有很多stream行的解决方法。 例如, underscore.js库定义了一个extend
函数,可以让你编写
req.params=_.extend(req.params || {}, req.query || {}, req.body || {}).
如果你不想使用图书馆,并想要自己的扩展对象的方式,看看这篇博客文章 。
Personnaly,我合并req.params
, req.body
, req.query
在一个单一的对象req.props
与Object.assign()
在ES6中:
你只需要在你的路线中写下这个:
app.get('/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.get('/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; });
现在,您可以在所有路由中轻松访问您的GET,POST,PUT params和req.props
,如果您决定删除旧的请求,请小心req.props
名字。
此外,你可以做一个function,使其更有用。
关于Object.assign()
更多信息: https : //developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign