Попытка внедрить 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
};
}
});