如何解析Node.js request模块获取的服务器响应
问题
我用Node.js的request模块请求指定URL的HTML内容,已经通过以下代码成功拿到HTML:
request(build[i], function(error, response, html) { // 代码逻辑 })
但没法解析服务器返回的response对象并访问内部数据,服务器响应的response对象结构如下:
<ref *2> IncomingMessage { _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { head: null, tail: null, length: 0 }, length: 0, pipes: [], flowing: true, ended: true, endEmitted: true, reading: false, constructed: true, sync: false, needReadable: false, emittedReadable: false, readableListening: false, resumeScheduled: false, errorEmitted: false, emitClose: true, autoDestroy: true, destroyed: false, errored: null, closed: false, closeEmitted: false, defaultEncoding: 'utf8', awaitDrainWriters: null, multiAwaitDrain: false, readingMore: false, dataEmitted: true, decoder: null, encoding: null, [Symbol(kPaused)]: false }, _events: [Object: null prototype] { end: [ [Function: responseOnEnd], [Function (anonymous)] ], close: [ [Function (anonymous)], [Function (anonymous)] ], data: [Function (anonymous)], error: [Function (anonymous)] }, _eventsCount: 4, _maxListeners: undefined, socket: <ref *1> TLSSocket { _tlsOptions: { allowHalfOpen: undefined, pipe: false, secureContext: [SecureContext], isServer: false, requestCert: true, rejectUnauthorized: true, session: undefined, ALPNProtocols: undefined, requestOCSP: undefined, enableTrace: undefined, pskCallback: undefined, highWaterMark: undefined, onread: undefined, signal: undefined }, _secureEstablished: true, _securePending: false, _newSessionPending: false, _controlReleased: true, secureConnecting: false, _SNICallback: null, servername: 'mysterioustrip.com', alpnProtocol: false, authorized: true, authorizationError: null, encrypted: true, _events: [Object: null prototype] { close: [Array], end: [Function: onReadableStreamEnd], newListener: [Function: keylogNewListener], secure: [Function: onConnectSecure], session: [Function (anonymous)], free: [Function: onFree], timeout: [Function: onTimeout], agentRemove: [Function: onRemove], error: [Function: socketErrorListener], finish: [Function] }, _eventsCount: 10, connecting: false, _hadError: false, _parent: null, _host: 'mysterioustrip.com', _closeAfterHandlingError: false, _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: BufferList { head: null, tail: null, length: 0 }, length: 0, pipes: [], flowing: true, ended: false, endEmitted: false, reading: false, constructed: true, // 省略剩余内容 } } }
我尝试用点符号访问response对象内的键值但没成功,请问该怎么访问这些数据?
解决方案
你遇到的response是Node.js原生的IncomingMessage对象,部分属性以下划线开头(属于内部实现属性),但仍可通过点符号或方括号正常访问,具体方式如下:
直接访问层级较浅的属性:不管属性是否以下划线开头,直接用点符号链式访问即可
// 访问响应的事件数量 console.log(response._eventsCount); // 访问socket中的服务器名称 console.log(response.socket.servername); // 访问socket的主机地址 console.log(response.socket._host);访问嵌套的内部属性:对于多层嵌套的属性,继续用点符号逐层访问
// 访问_readableState中的highWaterMark console.log(response._readableState.highWaterMark); // 访问socket下_tlsOptions的rejectUnauthorized配置 console.log(response.socket._tlsOptions.rejectUnauthorized);访问Symbol类型的属性:对于结构中类似
[Symbol(kPaused)]的Symbol属性,需要先获取对应的Symbol值,再用方括号访问// 找到对应的Symbol const kPausedSymbol = Object.getOwnPropertySymbols(response._readableState) .find(sym => sym.description === 'kPaused'); // 访问Symbol属性值 console.log(response._readableState[kPausedSymbol]);
额外提示
- request模块已被标记为废弃状态,后续建议迁移到
axios、node-fetch等仍在维护的HTTP库,这类库会将响应数据封装得更直观易用。 - 下划线开头的属性属于Node.js内部实现细节,可能会在版本更新中发生变更,生产环境使用需谨慎。
内容的提问来源于stack exchange,提问作者Selvakumar
相关产品推荐
相关产品推荐

