¿Qué son los parámetros "res" y "req" en las funciones Express?

183

En la siguiente función Express:

app.get('/user/:id', function(req, res){
    res.send('user' + req.params.id);
});

¿Qué son reqy res? ¿Qué representan, qué quieren decir y qué hacen?

¡Gracias!

expressnoob
fuente
1
req== "request"// res=="response"
nilon

Respuestas:

270

reqes un objeto que contiene información sobre la solicitud HTTP que provocó el evento. En respuesta a req, usted usa respara devolver la respuesta HTTP deseada.

Esos parámetros se pueden nombrar cualquier cosa. Puede cambiar ese código a esto si está más claro:

app.get('/user/:id', function(request, response){
  response.send('user ' + request.params.id);
});

Editar:

Digamos que tienes este método:

app.get('/people.json', function(request, response) { });

La solicitud será un objeto con propiedades como estas (solo por nombrar algunas):

  • request.url, que será "/people.json"cuando se active esta acción particular
  • request.method, que será "GET"en este caso, de ahí la app.get()llamada.
  • Una matriz de encabezados HTTP request.headers, que contiene elementos como request.headers.accept, que puede usar para determinar qué tipo de navegador realizó la solicitud, qué tipo de respuestas puede manejar, si es capaz de comprender la compresión HTTP, etc.
  • Una matriz de parámetros de cadena de consulta si hubiera alguno, en request.query(por ejemplo /people.json?foo=bar, resultaría en request.query.foocontener la cadena "bar").

Para responder a esa solicitud, utiliza el objeto de respuesta para generar su respuesta. Para ampliar el people.jsonejemplo:

app.get('/people.json', function(request, response) {
  // We want to set the content-type header so that the browser understands
  //  the content of the response.
  response.contentType('application/json');

  // Normally, the data is fetched from a database, but we can cheat:
  var people = [
    { name: 'Dave', location: 'Atlanta' },
    { name: 'Santa Claus', location: 'North Pole' },
    { name: 'Man in the Moon', location: 'The Moon' }
  ];

  // Since the request is for a JSON representation of the people, we
  //  should JSON serialize them. The built-in JSON.stringify() function
  //  does that.
  var peopleJSON = JSON.stringify(people);

  // Now, we can use the response object's send method to push that string
  //  of people JSON back to the browser in response to this request:
  response.send(peopleJSON);
});
Dave Ward
fuente
1
puedes usar curl para ver la respuesta completa con encabezados
generalhenry
3
Es posible que desee consultar: en.wikipedia.org/wiki/Hypertext_Transfer_Protocol . No ser sarcástico, ¡eso es algo que todos los que desarrollamos para la Web necesitamos saber!
TK-421
77
Sí, esto fue genial, debería estar en la página principal del sitio web express.js.
Anton
expressnoob: la respuesta es un objeto, al igual que el objeto de solicitud, pero contiene campos y métodos relacionados con la respuesta. Normalmente se usa el método send () de la respuesta. send () acepta un montón de tipos diferentes para el primer argumento, que se convierte en el cuerpo de respuesta HTTP, y el segundo argumento es el código de respuesta HTTP.
grantwparks
77
Si alguien está buscando detalles de reqy resestructura, que se describe en la documentación expresas: req: expressjs.com/en/api.html#req , res: expressjs.com/en/api.html#res
akn
25

Noté un error en la respuesta de Dave Ward (¿quizás un cambio reciente?): Los parámetros de cadena de consulta están dentro request.query, no request.params. (Ver https://stackoverflow.com/a/6913287/166530 )

request.params por defecto se llena con el valor de cualquier "coincidencia de componentes" en las rutas, es decir

app.get('/user/:id', function(request, response){
  response.send('user ' + request.params.id);
});

y, si ha configurado express para usar su bodyparser ( app.use(express.bodyParser());) también con datos POST'ed. (Consulte ¿Cómo recuperar los parámetros de consulta POST? )

Myrne Stol
fuente
6

Solicitud y respuesta.

Para entenderlo req, pruébalo console.log(req);.

generalhenry
fuente
3
Esto no ayuda; la salida en la consola es [objeto Object].
JEC
Si quieres json, tienes que: console.log (JSON.Stringify (req.body);
maridob