尝试使用mockttp将JavaScript注入网页

e4eetjau  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(113)

此问题来自超级用户migrated,因为4天前可以在Stack Overflow. Migrated上回答。
到目前为止,我已经尝试了下面的代码,但它抛给我一个错误Failed to handle request: Cannot read properties of undefined (reading 'replace')

var INJECT = "<script src='https://examlple.com/googletranslate.js'></script>"

await server.forAnyRequest().thenPassThrough({
    beforeResponse: (res) => {
        var newBody = res.body.text.replace("<head>", "<head>"+INJECT)
        return {
            status: 200,
            body: newBody
        };
    }
});

我怎样才能解决这个错误并成功地将JavaScript注入页面

7nbnzgx9

7nbnzgx91#

撇开Mockttp不谈,从这个错误本身,您可以判断出您正在尝试读取X.replace以获取未定义的X
在这种情况下,有一个明确的可能原因:res.body.text.replace(...)。这告诉您res.body.text未定义,因此这里有问题。
实际上,如果您查看Mockttp的CompletedBody类型的参考文档,您会发现没有.text属性-而是.getText(),这将返回一个承诺,而不是一个固定值(这是来自X1 E1 F1 X的突破性改变之一)。这些是异步的因为阅读请求的文本可能需要非平凡的解码步骤,例如解码Brotli数据。
这意味着你需要回调async,使用await,然后调用getText()。我没有测试过,但是我认为你的例子的这个版本应该可以正常工作:

var INJECT = "<script src='https://examlple.com/googletranslate.js'></script>"

await server.forAnyRequest().thenPassThrough({
    beforeResponse: async (res) => { // <-- Make the callback async
        var oldBody = await res.body.getText() // <-- await the result of getText()
        var newBody = oldBody.replace("<head>", "<head>"+INJECT)
        return {
            status: 200,
            body: newBody
        };
    }
});

相关问题