Estoy tratando de configurar un servidor web simple que devuelva el contenido de la solicitud como respuesta con node.js y express.js. Mi código es el siguiente:
const express = require('express'); const app = express(); const port = 3000; app.get("/", function(request,response){ // console.log(request); response.send(request); }); app.listen(port, function() { console.log("Server started on port #" + port); });Y me sale este error:
TypeError: Converting circular structure to JSON --> starting at object with constructor 'Socket' | property 'parser' -> object with constructor 'HTTPParser' --- property 'socket' closes the circle at JSON.stringify (<anonymous>) ¿Qué está sucediendo exactamente y cómo puedo modificar mi código para lograr mi objetivo inicial? Quiero devolver una respuesta que contenga el contenido de la solicitud. Puedo console.log(request) sin ningún problema, así que estoy aún más confundido aquí. Intenté buscar este error, pero la mayoría no parece aplicarse a este caso.
Tenga en cuenta que el tipo de Request no es solo el contenido de la solicitud, puede leer sobre esto en la documentación oficial de Node.js. En particular, el tipo representa una solicitud en curso cuyo encabezado ya se ha puesto en cola . No es la solicitud completa: ¡el cuerpo aún puede enviarse cuando se llama a su función! Este es un patrón común en las bibliotecas HTTP, ya que puede procesar los encabezados HTTP antes de que el cuerpo esté listo para enviarse.
Es un objeto complejo, que tiene referencias circulares en su interior. Significa que alguna propiedad del objeto apunta a otra propiedad del mismo objeto, y no puede representar eso en JSON . Aquí hay una buena pregunta al respecto . Todavía puede hacer un console.log porque la función maneja las referencias circulares con gracia.
Para devolver la solicitud, debe esperar explícitamente a que el cuerpo se envíe por completo (que puede venir dividido en partes). Nuevamente, los documentos oficiales cubren esto:
app.get("/", function(request,response){ let body = []; request.on('data', (chunk) => { body.push(chunk); }).on('end', () => { body = Buffer.concat(body).toString(); // at this point, `body` has the entire request body stored in it as a string response.send(body); }); }); Si desea extraer otra información de la solicitud, puede consultar la documentación sobre cómo hacerlo, pero no asuma que la request o el tipo de response son solo sus contenidos.
EDITAR: No me di cuenta de que está usando express.js , que tiene un tipo de request diferente. Los principios son los mismos, pero el cuerpo se expone de una manera diferente, puede encontrar cómo en la documentación oficial :
var express = require('express') var app = express() app.use(express.json()) // for parsing application/json app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded get('/', function (req, res) { res.json(req.body) })¿Qué necesita saber sobre la solicitud? Método, url, encabezados, consulta, parámetros... simplemente extraiga lo que necesita:
app.get("/", function(request,response){ const { headers, method, url, search } = request; response.json({ headers, method, url, search }); });No debe devolver la solicitud completa, ya que es un objeto complejo que nunca estuvo destinado a serializarse.