2012-07-26 23 views
7

Soy nuevo al Nodo/expreso .. Veo GET params puede ser capturado de esta manera:nodejs, expreso consigue el poste params

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

la POST, así:

app.post('/log', ... (variables de formulario disponible en req.body.)

Conozco App.all, pero ¿hay alguna manera en que pueda obtener todas las variables para GET y POST cuando uso app.all? (Estoy demasiado acostumbrado a $ _REQUEST en php :)

THX,

+0

'JSON.stringify (req.query)' 'para GET' y' JSON.stringify (req.body) '' para Post' suponiendo que 'app.use (Express. bodyParser()) ' –

Respuesta

17

Usted está tratando con tres métodos diferentes de parámetros de paso de:!

1) parámetros Path, que expresan de capturas de router en req.param cuando usa componentes con prefijo de coma o capturas de expresiones regulares en su ruta. Estos pueden estar presentes en las solicitudes GET y POST.

2) parámetros de cadena de consulta URL, que se capturarán en req.query si utiliza el middleware express.query. Estos también pueden estar presentes en las solicitudes GET y POST.

3) Parámetros corporales, que se capturarán en req.body si utiliza el middleware express.bodyParser. Estos solo estarán presentes en las solicitudes POST que tengan un Content-Type de "x-www-form-urlencoded".

Entonces, lo que necesita hacer es fusionar los tres objetos (si existen) en uno solo. No hay métodos nativos Object para hacerlo, pero hay muchas soluciones populares. Por ejemplo, la biblioteca underscore.js define una función extend, lo que permitirá escribir

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

Si no desea utilizar una biblioteca y quiere rodar su propia forma de extender objetos, echar un vistazo a this blog post .

+3

Creo' req.param() 'hace exactamente eso - http://expressjs.com/api.html#req.param –

0

Personnaly, puedo combinar req.params, req.body, req.query en un solo objeto req.props con Object.assign()

en ES6:

sólo tiene que escribir esto en su ruta:

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

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

Ahora, puede acceder fácilmente a sus parámetros GET, POST, PUT con req.props en todas sus rutas, tenga cuidado con el mismo nombre si decide eliminar la antigua solicitud.

Además, puede hacer un middleware/funciones para hacerlo aún más útil.

Más sobre Object.assign(): https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign