Node.js solicita documentación del objeto? [cerrado]

80

Esta es una pregunta bastante sencilla, pero no he encontrado nada en Google. Estoy buscando documentación sobre el parámetro de solicitud en la función de servidor de creación de Node.js, pero no he podido encontrar nada.

http.createServer(function(request, response){
  console.log(JSON.stringify(request));
});

La depuración con JSON.stringify () me da un error, que el objeto es circular y el programa se detiene. He visto cosas diferentes como request.url, o request.body, pero ¿hay una página que documente todas las funciones y parámetros de la solicitud? Parece que debería ser fácil de encontrar, pero parece que no puedo encontrarlo.

Lo intenté de nuevo, y resulta que simplemente al hacer console.log(request)escribe todos los datos de la solicitud. Aquí es solo como referencia:

ondata: [Function],
     _httpMessage:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        output: [],
        outputEncodings: [],
        writable: true,
        _last: false,
        chunkedEncoding: false,
        shouldKeepAlive: true,
        useChunkedEncodingByDefault: true,
        sendDate: true,
        _hasBody: true,
        _trailer: '',
        finished: false,
        _hangupClose: false,
        socket: [Circular],
        connection: [Circular] } },
  connection:
   { _connecting: false,
     _handle:
      { fd: null,
        writeQueueSize: 0,
        owner: [Circular],
        onread: [Function: onread],
        reading: true },
     _readableState:
      { highWaterMark: 16384,
        buffer: [],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: false,
        ended: false,
        endEmitted: false,
        reading: true,
        calledRead: true,
        sync: false,
        needReadable: true,
        emittedReadable: false,
        readableListening: false,
        objectMode: false,
        defaultEncoding: 'utf8',
        ranOut: false,
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: true,
     domain: null,
     _events:
      { end: [Object],
        finish: [Function: onSocketFinish],
        _socketEnd: [Function: onSocketEnd],
        drain: [Function: ondrain],
        timeout: [Function],
        error: [Function],
        close: [Object] },
     _maxListeners: 10,
     _writableState:
      { highWaterMark: 16384,
        objectMode: false,
        needDrain: false,
        ending: false,
        ended: false,
        finished: false,
        decodeStrings: false,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        sync: true,
        bufferProcessing: false,
        onwrite: [Function],
        writecb: null,
        writelen: 0,
        buffer: [] },
     writable: true,
     allowHalfOpen: true,
     onend: [Function],
     destroyed: false,
     errorEmitted: false,
     bytesRead: 357,
     _bytesDispatched: 0,
     _pendingData: null,
     _pendingEncoding: '',
     server:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _connections: 1,
        connections: [Getter/Setter],
        _handle: [Object],
        _usingSlaves: false,
        _slaves: [],
        allowHalfOpen: true,
        httpAllowHalfOpen: false,
        timeout: 120000,
        _connectionKey: '4:0.0.0.0:1337' },
     _idleTimeout: 120000,
     _idleNext:
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        msecs: 120000,
        ontimeout: [Function: listOnTimeout] },
     _idlePrev:
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        msecs: 120000,
        ontimeout: [Function: listOnTimeout] },
     _idleStart: 1371952289619,
     parser:
      { _headers: [],
        _url: '',
        onHeaders: [Function: parserOnHeaders],
        onHeadersComplete: [Function: parserOnHeadersComplete],
        onBody: [Function: parserOnBody],
        onMessageComplete: [Function: parserOnMessageComplete],
        socket: [Circular],
        incoming: [Circular],
        maxHeaderPairs: 2000,
        onIncoming: [Function] },
     ondata: [Function],
     _httpMessage:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        output: [],
        outputEncodings: [],
        writable: true,
        _last: false,
        chunkedEncoding: false,
        shouldKeepAlive: true,
        useChunkedEncodingByDefault: true,
        sendDate: true,
        _hasBody: true,
        _trailer: '',
        finished: false,
        _hangupClose: false,
        socket: [Circular],
        connection: [Circular] } },
  httpVersion: '1.1',
  complete: false,
  headers:
   { host: 'localhost:1337',
     connection: 'keep-alive',
     'cache-control': 'max-age=0',
     accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
     'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like
 Gecko) Chrome/27.0.1453.116 Safari/537.36',
     'accept-encoding': 'gzip,deflate,sdch',
     'accept-language': 'en-US,en;q=0.8,ja;q=0.6' },
  trailers: {},
  _pendings: [],
  _pendingIndex: 0,
  url: '/',
  method: 'GET',
  statusCode: null,
  client:
   { _connecting: false,
     _handle:
      { fd: null,
        writeQueueSize: 0,
        owner: [Circular],
        onread: [Function: onread],
        reading: true },
     _readableState:
      { highWaterMark: 16384,
        buffer: [],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: false,
        ended: false,
        endEmitted: false,
        reading: true,
        calledRead: true,
        sync: false,
        needReadable: true,
        emittedReadable: false,
        readableListening: false,
        objectMode: false,
        defaultEncoding: 'utf8',
        ranOut: false,
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: true,
     domain: null,
     _events:
      { end: [Object],
        finish: [Function: onSocketFinish],
        _socketEnd: [Function: onSocketEnd],
        drain: [Function: ondrain],
        timeout: [Function],
        error: [Function],
        close: [Object] },
     _maxListeners: 10,
     _writableState:
      { highWaterMark: 16384,
        objectMode: false,
        needDrain: false,
        ending: false,
        ended: false,
        finished: false,
        decodeStrings: false,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        sync: true,
        bufferProcessing: false,
        onwrite: [Function],
        writecb: null,
        writelen: 0,
        buffer: [] },
     writable: true,
     allowHalfOpen: true,
     onend: [Function],
     destroyed: false,
     errorEmitted: false,
     bytesRead: 357,
     _bytesDispatched: 0,
     _pendingData: null,
     _pendingEncoding: '',
     server:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _connections: 1,
        connections: [Getter/Setter],
        _handle: [Object],
        _usingSlaves: false,
        _slaves: [],
        allowHalfOpen: true,
        httpAllowHalfOpen: false,
        timeout: 120000,
        _connectionKey: '4:0.0.0.0:1337' },
     _idleTimeout: 120000,
     _idleNext:
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        msecs: 120000,
        ontimeout: [Function: listOnTimeout] },
     _idlePrev:
      { _idleNext: [Circular],
        _idlePrev: [Circular],
        msecs: 120000,
        ontimeout: [Function: listOnTimeout] },
     _idleStart: 1371952289619,
     parser:
      { _headers: [],
        _url: '',
        onHeaders: [Function: parserOnHeaders],
        onHeadersComplete: [Function: parserOnHeadersComplete],
        onBody: [Function: parserOnBody],
        onMessageComplete: [Function: parserOnMessageComplete],
        socket: [Circular],
        incoming: [Circular],
        maxHeaderPairs: 2000,
        onIncoming: [Function] },
     ondata: [Function],
     _httpMessage:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        output: [],
        outputEncodings: [],
        writable: true,
        _last: false,
        chunkedEncoding: false,
        shouldKeepAlive: true,
        useChunkedEncodingByDefault: true,
        sendDate: true,
        _hasBody: true,
        _trailer: '',
        finished: false,
        _hangupClose: false,
        socket: [Circular],
        connection: [Circular] } },
  _consuming: false,
  _dumped: false,
  httpVersionMajor: 1,
  httpVersionMinor: 1,
  upgrade: false }
Benjamin Collins
fuente
54
Tienes mi simpatía. La mayoría de los lenguajes, bibliotecas y marcos modernos tienen una documentación de referencia espantosa. Si visita la documentación del nodo a la que se hace referencia a continuación, encontrará que en realidad no es una referencia en absoluto; es más una discusión. Por ejemplo, el documento createServer () dice que toma como parámetro "una función que se agrega automáticamente al evento 'solicitud'" y devuelve "un objeto de servidor web". No hay ninguna pista sobre qué 'tipo' es cualquiera de estas cosas, y ciertamente no hay un vínculo al documento de referencia para esas cosas. ¿Qué son? F menos para los documentos.
jarmod
1
Leí la pregunta y me parece bastante razonable. El problema aquí es que son las respuestas las que han llevado esto de una pregunta a una conversación / fiesta de lástima sobre documentación horrible. Si se pudiera dar una respuesta / explicación razonable, creo que esta pregunta se puede salvar. Quizás incluso una nueva pregunta relacionada sea la mejor.
demongolem
Hice esta pregunta hace 6 años. Desde entonces, he adquirido mucha más experiencia leyendo la documentación de Nodejs, y quien haya trabajado en la documentación de Nodejs ha hecho un gran trabajo para mantenerla actualizada y precisa. Creo que esta pregunta ha recibido mucha atención porque es una pregunta simple, pero muestra que hay mucha información disponible a través de console.log en caso de que te quedes atascado en algo.
Benjamin Collins

Respuestas:

26

No estoy seguro de si esta es una respuesta correcta, ya que me parece sencilla, pero ¿echaste un vistazo a http://nodejs.org/api/http.html#http_http_incomingmessage ?

La solicitud es una instancia del objeto anterior. Por cierto, si realmente desea ver qué hay dentro de ese objeto con "fuerza bruta", no debe analizarlo, ya que no será una cadena JSON en absoluto, sino que haga algo como:

for (i in request) {
  //Your code here
}

Espero eso ayude.

Delio
fuente
Vaya, quise decir json.stringify, no json.parse. Volví para probar el enfoque for (i in request) que mencionaste y, por alguna razón, solo hacer console.log (request) terminó funcionando. Esperaba que dijera simplemente [Objeto objeto]. ¿Quizás tiene una función toString específica para la consola? Gracias por la respuesta.
Benjamin Collins
5
Mejor aún, para ver qué hay dentro de cualquier objeto, use util.inspect (). Util es un módulo central; puede simplemente var util=require('util');y el util.inspect(obj). Un problema básico con JSON.stringify()es que se quejará si hay referencias cíclicas.
Thalis K.
2
_readableState, readable, domain, _events, _maxListeners, socket, connection, httpVersion, complete, headers, trailers, _pendings, _pendingIndex, url, method, statusCode, client, _consuming, _dumped, httpVersionMajor, httpVersionMinor, upgrade, setTimeout, read, _read, destroy, _addHeaderLine, _dump, push, unshift, setEncoding, pipe, unpipe, on, addListener, resume, pause, wrap, setMaxListeners, emit, once, removeListener, removeAllListeners,listeners
CaffeineAddiction
3
El enlace está desactualizado: nodejs.org/api/http.html#http_class_http_incomingmessage
Wex
10

Solo para agregar, como un novato relativo en Node.js, me resulta confuso que cada marco tenga su propia implementación de un objeto de "solicitud".

Por ejemplo,

Express: http://expressjs.com/api.html#req.param

y

Hapi: http://spumko.github.io/resource/api/#request-object (solo para tener en cuenta que el objeto de solicitud sin formato todavía está disponible en request.raw.req)

Algunas bibliotecas asumen la presencia del método "req.param" de Express y fallan cuando se utilizan en proyectos que no son de Express.

Shaunlim
fuente
Muchas gracias por compartir la opción api express.
Muhammad Raihan Muhaimin
El enlace spumko está roto.
Charles Holbrow
La documentación de análisis es más completa que la mayoría: parse.com/docs/js/symbols/http.IncomingMessage.html
Charles Holbrow
esa URL de análisis es 404, fwiw
Jon Biz
¿Por qué usarías un "framework" http? Node.js hace http de forma nativa.
BT
6

Estoy de acuerdo con Delio, el objeto Request es de tipo IncomingMessage, que es creado por http.ClientRequest.

Frederick G. Sandalo
fuente