2012-07-26 73 views
7

我是新来的节点/快递..我看到GET PARAMS可以捕获像这样:的NodeJS,快速GET post数据

app.get('/log/:name', api.logfunc); 

POST像这样:在

app.post('/log', ...(表单变量可用)

我知道app.all,但是有没有一种方法可以在使用app.all时获取GET和POST的所有变量? (我太习惯$ _REQUEST在PHP :)

THX,

+0

'JSON.stringify(req.query)''为和GET''JSON.stringify(req.body)''为假设POST'你'app.use(表达。 bodyParser())' – 2012-07-26 04:21:12

回答

17

你处理的参数传递的三种不同的方法:

1)路径参数,其表达的路由器捕获在req.param中,当您在路由中使用冒号前缀组件或正则表达式捕获。这些可以出现在GET和POST请求中。

2)URL查询字符串参数,如果您使用express.query中间件,将在req.query中捕获这些参数。这些也可以出现在GET和POST请求中。

3)身体参数,如果您使用express.bodyParser中间件,将在req.body中捕获身体参数。这些只会出现在具有“x-www-form-urlencoded”Content-Type的POST请求中。

所以你需要做的是将所有三个对象(如果它们存在)合并成一个。这样做没有本地的Object方法,但有很多流行的解决方法。例如,underscore.js库定义的extend功能,这将允许你写

req.params=_.extend(req.params || {}, req.query || {}, req.body || {}). 

如果你不想使用一个库,并希望推出自己的延长对象的方法,看看this blog post

+3

我相信'req。param()'完全是这样 - http://expressjs.com/api.html#req.param – 2013-09-12 10:43:17

0

Personnaly,我合并req.paramsreq.bodyreq.query在一个单独的对象req.propsObject.assign()

在ES6:

你只需要在你的路线,这样写:

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

现在,您可以轻松访问所有路线中的GET,POST,PUT参数,req.props,如果您决定删除旧请求,请小心类似名称。

此外,你可以做一个中间件/功能,使它更有用。

更多Object.assign()https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign