我在Node中编写了一个代理服务器,需要能够通过tls隧道传输https请求,并且一切都正常。使用以下两个软件包非常容易设置:proxy,https-proxy-agent。我的问题是,我正在尝试使用connect作为中间件层捕获HAR文件,但我遇到了以下错误:
_http_outgoing.js:357
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.writeHead (_http_server.js:180:21)
at ClientRequest.<anonymous> (/.../node_modules/proxy/proxy.js:233:11)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:188:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:473:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
at Socket.socketOnData (_http_client.js:362:20)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
这个问题很简单,只有在我使用connect并通过我的本地浏览器代理时才会出现(这个代理实际上是与BrowserStackLocal一起使用的)。当我从除了本地机器浏览器以外的任何东西通过代理时,就好像它根本不知道中间件的存在。
所以基本上,我只需要让connect在这种情况下工作,我不确定是否需要暂停某些内容并恢复,或者其他什么...任何想法都将不胜感激。以下是基本代码:
const path = require('path');
const http = require('http');
const proxy = require('proxy');
const Agent = require('https-proxy-agent');
const connect = require('connect');
const har = require('./har');
const middleware = connect();
middleware.use(har({
harOutputDir: path.resolve(process.cwd(), 'har/')
}));
const server = proxy(http.createServer(middleware));
server.agent = new Agent('http://localhost:8081');
server.listen(8081)
谢谢!
编辑:只是一个注意事项:har中间件根本不会修改头部。