Попытка внедрить JavaScript на веб-страницу с помощью mockttp

До сих пор я пробовал приведенный ниже код, но он выдавал мне ошибку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 на страницу

1 ответ

Помимо Mockttp, по этой ошибке самой по себе вы можете сказать, что где-то вы пытаетесь прочитатьX.replaceдляXэто не определено.

В этом случае есть четкая вероятная причина:res.body.text.replace(...). Это говорит вам, чтоres.body.textне определено, значит, что-то здесь не так.

На самом деле, если вы посмотрите справочную документацию Mockttp для типа CompletedBody , вы увидите, что нет.textимущество - это.getText()вместо этого, и это возвращает обещание, а не фиксированное значение (это одно из критических изменений по сравнению с Mockttp v3). Они асинхронны, потому что чтение текста запроса может потребовать нетривиальных шагов декодирования, например, для декодирования данных 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
        };
    }
});
Другие вопросы по тегам