在Nodejs中,当我console.log一个req对象,引用是什么? 如何确定

在Nodejs中,当我console.log一个req对象时,[Circular]是什么意思?

以下是一个基于nodejs示例的console.log(req)示例。 注意request.socket._readWatcher.socket是一个[Circular]。 这是否意味着它本身? 我怎样才能解除引用?

{ socket: { bufferSize: 0, fd: 7, type: 'tcp4', allowHalfOpen: true, _readWatcher: { socket: [Circular], callback: [Function: onReadable] }, destroyed: false, readable: true, _writeQueue: [], _writeQueueEncoding: [], _writeQueueFD: [], _writeQueueCallbacks: [], _writeWatcher: { socket: [Circular], callback: [Function: onWritable] }, writable: true, _writeImpl: [Function], _readImpl: [Function], _shutdownImpl: [Function], remoteAddress: '127.0.1.1', remotePort: 40407, server: { connections: 1, allowHalfOpen: true, watcher: [Object], _events: [Object], httpAllowHalfOpen: false, type: 'tcp4', fd: 5 }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idlePrev: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idleStart: Sun, 15 May 2011 01:18:50 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: { output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: true, shouldKeepAlive: true, useChunkedEncodingByDefault: true, _hasBody: true, _trailer: '', finished: false, socket: [Circular], connection: [Circular], _events: [Object], _header: 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n', _headerSent: false } }, connection: { bufferSize: 0, fd: 7, type: 'tcp4', allowHalfOpen: true, _readWatcher: { socket: [Circular], callback: [Function: onReadable] }, destroyed: false, readable: true, _writeQueue: [], _writeQueueEncoding: [], _writeQueueFD: [], _writeQueueCallbacks: [], _writeWatcher: { socket: [Circular], callback: [Function: onWritable] }, writable: true, _writeImpl: [Function], _readImpl: [Function], _shutdownImpl: [Function], remoteAddress: '127.0.1.1', remotePort: 40407, server: { connections: 1, allowHalfOpen: true, watcher: [Object], _events: [Object], httpAllowHalfOpen: false, type: 'tcp4', fd: 5 }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idlePrev: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idleStart: Sun, 15 May 2011 01:18:50 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: { output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: true, shouldKeepAlive: true, useChunkedEncodingByDefault: true, _hasBody: true, _trailer: '', finished: false, socket: [Circular], connection: [Circular], _events: [Object], _header: 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n', _headerSent: false } }, httpVersion: '1.1', complete: false, headers: { 'user-agent': 'curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18', host: 'uh-uh-uh-I-aint-telling', accept: '*/*' }, trailers: {}, readable: true, url: '/', method: 'GET', statusCode: null, client: { bufferSize: 0, fd: 7, type: 'tcp4', allowHalfOpen: true, _readWatcher: { socket: [Circular], callback: [Function: onReadable] }, destroyed: false, readable: true, _writeQueue: [], _writeQueueEncoding: [], _writeQueueFD: [], _writeQueueCallbacks: [], _writeWatcher: { socket: [Circular], callback: [Function: onWritable] }, writable: true, _writeImpl: [Function], _readImpl: [Function], _shutdownImpl: [Function], remoteAddress: '127.0.1.1', remotePort: 40407, server: { connections: 1, allowHalfOpen: true, watcher: [Object], _events: [Object], httpAllowHalfOpen: false, type: 'tcp4', fd: 5 }, ondrain: [Function], _idleTimeout: 120000, _idleNext: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idlePrev: { repeat: 120, _idleNext: [Circular], _idlePrev: [Circular], callback: [Function] }, _idleStart: Sun, 15 May 2011 01:18:50 GMT, _events: { timeout: [Function], error: [Function], close: [Function] }, ondata: [Function], onend: [Function], _httpMessage: { output: [], outputEncodings: [], writable: true, _last: false, chunkedEncoding: true, shouldKeepAlive: true, useChunkedEncodingByDefault: true, _hasBody: true, _trailer: '', finished: false, socket: [Circular], connection: [Circular], _events: [Object], _header: 'HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n', _headerSent: false } }, httpVersionMajor: 1, httpVersionMinor: 1, upgrade: false } 

UPDATE

由于我显然不像以前那么清楚,我怎样才能解释引用循环引用的元素? 它总是父元素?

另外值得注意的是,昨天晚上我了解了Utils类和检查方法。 这可能会给我更多的信息,比我应该合理想知道;)

[Circular]只是指循环参考。

 var o = { "self": o } 

显示为

 { "self": [Circular] } 

可以显示为

 { "self": { "self": { "self": { ... } } } } 

在你的情况下socket是外套接字。

_idleNext_idlePrev也指向外部的。

更新

 _idleNext: // This one! { repeat: 120, _idleNext: [Circular], { socket: // this one! { bufferSize: 0, fd: 7, type: 'tcp4', allowHalfOpen: true, _readWatcher: { socket: [Circular], callback: [Function: onReadable] }, destroyed: false, readable: true, _writeQueue: [], _writeQueueEncoding: [], _writeQueueFD: [], _writeQueueCallbacks: [], _writeWatcher: { socket: [Circular], 

这是一个循环的参考。 就这样。

例:

 ab = a 

现在logging下来:

 [Object a] { b: [Object a] { b: [Object a] { b: [Object a] { b: [Object a] { b: [Object a] { b: [Object a] { ... welcome to recursion! } } } } } } } 

它永远不会和log调用会产生堆栈溢出,就是这样。 节点检测那些反而发出循环参考文本。

request.socket._readWatcher.socket == request.socket同样适用于其他[Circular]引用。

你不应该解引用它们,因为它会导致未定义的行为(具有套接字的对象需要引用才能正常工作)。