gpt4 book ai didi

javascript - 附加调试器后,Electron BrowserWindow无法获得响应

转载 作者:行者123 更新时间:2023-12-03 12:37:19 35 4
gpt4 key购买 nike

我正在编写一个创建BrowserWindow的Electron应用程序。我想捕获发送到服务器的一些请求,我还希望响应来处理那里的请求。使用Electron WebRequest api无法获得响应,因此在网上搜索后发现我可以以编程方式附加调试器。
我使用以下代码附加调试器,并且几乎可以正确获得所有响应。但是对于一个更大的请求,我无法获得答复。我得到一个错误

Error: No resource with given identifier found
如果启动DevTools并导航到该请求,我也将无法获得响应: Failed to load response data。如果我在下面的代码中注释掉,DevTools中的响应将正确显示。
请注意,这仅对 一个特定请求发生,该请求返回大约1MB的响应。对于所有其他请求,我可以使用 getResponseData()获得响应。
const dbg = win.webContents.debugger

var getResponseData = async (reqId) => {
const res = await dbg.sendCommand("Network.getResponseBody", {requestId: reqId});
return res.body
}

try {
dbg.attach('1.3')
dbg.sendCommand('Network.enable')
} catch (err) {
console.log('Debugger attach failed : ', err)
}

dbg.on('detach', async (event, reason) => {
console.log('Debugger detached due to : ', reason)
})

dbg.on('message', (e, m, p) => {
if (m === 'Network.requestWillBeSent') {
if (p.request.url === someURL) {
const j = JSON.parse(p.request.postData)
console.log("req " + p.requestId)
global.webReqs[p.requestId] = { reqData: j}
}
} else if (m === 'Network.loadingFinished') {
if (p.requestId in global.webReqs) {
console.log("res " + p.requestId)
getResponseData(p.requestId).then(res => {
console.log(res.slice(0,60))
}).catch(err => {
console.error(err)
})
}
}
});
简短更新
此特定请求的事件堆栈如下,其中 13548.212只是requestId
Network.requestWillBeSentExtraInfo 13548.212
Network.requestWillBeSent 13548.212
Network.responseReceivedExtraInfo 13548.212
Network.responseReceived 13548.212
Network.dataReceived 13548.212 [repeated 135 times]
...
Network.loadingFinished 13548.212

最佳答案

看来我找到了解决方案。这是一个变通方法,但是可以。我没有使用Network.getResponseBody。我使用了Fetch(https://chromedevtools.github.io/devtools-protocol/tot/Fetch)。
要使用该功能,需要订阅与模式匹配的响应。然后,您可以对Fetch.requestPaused事件使用react。在此期间,您可以直接访问请求,也可以间接访问响应。要获得响应,请使用正确的Fetch.getResponseBody调用requestId。还记得发送Fetch.continueRequest

The request is paused until the client responds with one of continueRequest, failRequest or fulfillRequest


https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#event-requestPaused
   dbg.sendCommand('Fetch.enable', {
patterns: [
{ urlPattern: interestingURLpattern, requestStage: "Response" }
]})

var getResponseJson = async (requestId) => {
const res = await dbg.sendCommand("Fetch.getResponseBody", {requestId: requestId})
return JSON.parse(res.base64Encoded ? Buffer.from(res.body, 'base64').toString() : res.body)
}
dbg.on('message', (e, m, p) => {
if(m === 'Fetch.requestPaused') {
var reqJson = JSON.parse(p.request.postData)
var resJson = await getResponseJson(p.requestId)
...

await dbg.sendCommand("Fetch.continueRequest", {requestId: p.requestId})
}
});

关于javascript - 附加调试器后,Electron BrowserWindow无法获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66101799/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com