Node.js żąda dokumentacji obiektu? [Zamknięte]

80

To dość proste pytanie, ale nie znalazłem niczego w Google. Szukam dokumentacji na temat parametru żądania w funkcji tworzenia serwera Node.js, ale nie udało mi się nic znaleźć.

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

Debugowanie za pomocą JSON.stringify () daje mi błąd, że obiekt jest cykliczny i program się zatrzymuje. Widziałem różne rzeczy, takie jak request.url, lub request.body, ale czy istnieje strona dokumentująca wszystkie funkcje i parametry żądania? Wygląda na to, że powinno być łatwe do znalezienia, po prostu nie mogę go znaleźć.

Spróbowałem ponownie i okazuje się, że po prostu console.log(request)wypisuje wszystkie dane z żądania. Tutaj jest tylko jako odniesienie:

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
źródło
54
Masz moje współczucie. Większość współczesnych języków, bibliotek i frameworków ma przerażającą dokumentację referencyjną. Jeśli odwiedzisz dokumentację węzła, o której mowa poniżej, przekonasz się, że nie jest to w rzeczywistości odniesienie; to bardziej dyskusja. Na przykład dokument createServer () mówi, że jako parametr przyjmuje „funkcję, która jest automatycznie dodawana do zdarzenia„ request ”” i zwraca „obiekt serwera WWW”. Nie ma żadnej wskazówki co do tego, co to za „typ”, a na pewno nie ma linku do dokumentu referencyjnego na temat tych rzeczy. Czym oni są? F minus za dokumenty.
jarmod
1
Przeczytałem pytanie i wydaje mi się całkiem rozsądne. Problem polega na tym, że to odpowiedzi przeniosły to z pytania do rozmowy / litości na temat okropnej dokumentacji. Jeśli można by udzielić rozsądnej odpowiedzi / wyjaśnienia, myślę, że to pytanie jest możliwe do rozwiązania. Być może nawet nowe, powiązane pytanie jest najlepsze.
demongolem
Zadałem to pytanie 6 lat temu. Od tego czasu zdobyłem znacznie większe doświadczenie w czytaniu dokumentacji Nodejsa, a kto kiedykolwiek pracował nad dokumentacją Nodejs, wykonał ogromną robotę, dbając o jej aktualność i dokładność. Myślę, że to pytanie zyskało wiele uwagi, ponieważ jest proste, ale pokazuje, że jest wiele informacji dostępnych przez console.log na wypadek, gdybyś na czymś utknął.
Benjamin Collins,

Odpowiedzi:

26

Nie jestem pewien, czy to jest poprawna odpowiedź, ponieważ wydaje mi się prosta, ale czy spojrzałeś na http://nodejs.org/api/http.html#http_http_incomingmessage ?

Żądanie jest instancją powyższego obiektu. Nawiasem mówiąc, jeśli naprawdę chcesz zobaczyć, co jest w środku tego obiektu za pomocą „brutalnej siły”, nie powinieneś go analizować, ponieważ nie będzie to w ogóle ciąg JSON, ale zamiast tego zrób coś takiego:

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

Mam nadzieję, że to pomoże.

Delio
źródło
Ups, miałem na myśli json.stringify, a nie json.parse. Wróciłem, aby wypróbować podejście for (i in request), o którym wspomniałeś, iz jakiegoś powodu po prostu wykonanie console.log (żądanie) zakończyło się sukcesem. Spodziewałem się, że powie po prostu [obiekt obiektu]. Może ma specyficzną funkcję toString dla konsoli? Dziękuję za odpowiedź.
Benjamin Collins
5
Jeszcze lepiej, aby zobaczyć, co jest wewnątrz dowolnego obiektu, użyj funkcji util.inspect (). Util to podstawowy moduł; możesz po prostu var util=require('util');i util.inspect(obj). Podstawowym problemem JSON.stringify()jest to, że będzie narzekać, jeśli istnieją cykliczne odwołania.
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
10

Na marginesie, jako względny nowicjusz w Node.js uważam za mylące, że każdy framework ma swoją własną implementację obiektu „request”.

Na przykład,

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

i

Hapi: http://spumko.github.io/resource/api/#request-object (wystarczy zauważyć, że obiekt surowego żądania jest nadal dostępny w request.raw.req)

Niektóre biblioteki zakładają obecność metody „req.param” Express i zawodzą, gdy są używane w projektach innych niż Express.

shaunlim
źródło
Bardzo dziękujemy za udostępnienie opcji Express API.
Muhammad Raihan Muhaimin
Link spumko jest uszkodzony.
Charles Holbrow,
Dokumentacja analizy jest bardziej kompletna niż większość: parse.com/docs/js/symbols/http.IncomingMessage.html
Charles Holbrow,
ten adres URL parsowania to 404, fwiw
Jon Biz
Dlaczego miałbyś kiedykolwiek używać „frameworka” http? Node.js obsługuje http natywnie.
BT
6

Zgadzam się z Delio, obiekt Request jest obiektem typu IncomingMessage, który jest tworzony przez http.ClientRequest.

Frederick G. Sandalo
źródło