cloudflare - 使用 HTMLRewriter 测试 cloudflare worker 失败,因为它未定义
问题描述
我有一个测试来测试我的 cloudflare 工作者,如下所示:
const workerScript = fs.readFileSync(
path.resolve(__dirname, '../pkg-prd/worker.js'),
'utf8'
);
describe('worker unit test', function () {
// this.timeout(60000);
let worker;
beforeEach(() => {
worker = new Cloudworker(workerScript, {
bindings: {
HTMLRewriter
},
});
});
it('tests requests and responses', async () => {
const request = new Cloudworker.Request('https://www.example.com/pathname')
const response = await worker.dispatch(request);
console.log(response);
// const body = await response.json();
expect(response.status).to.eql(200);
// expect(body).to.eql({message: 'Hello mocha!'});
});
});
在我的工人中,我做这样的事情:
const response = await fetch(BASE_URL, request);
const modifiedResponse = new Response(response.body, response);
// Remove the webflow badge
class ElementHandler {
element(element) {
element.append('<style type="text/css">body .w-webflow-badge {display: none!important}</style>', {html: true})
}
}
console.log(3);
return new HTMLRewriter()
.on('head', new ElementHandler()).transform(modifiedResponse);
现在,当我运行测试时,我收到以下错误消息:
● worker unit test › tests requests and responses
TypeError: Cannot read property 'transform' of undefined
at evalmachine.<anonymous>:1:1364
at FetchEvent.respondWith (node_modules/@dollarshaveclub/cloudworker/lib/cloudworker.js:39:17)
似乎有什么问题?
我创建的 HTMLRewriter 如下所示:
function HTMLRewriter() {
const elementHandler = {};
const on = (selector, handler) => {
if (handler && handler.element) {
if (!elementHandler[selector]) {
elementHandler[selector] = [];
}
elementHandler[selector].push(handler.element.bind(handler));
}
};
const transform = async response => {
const tempResponse = response.clone();
const doc = HTMLParser.parse(await tempResponse.text());
Object.keys(elementHandler).forEach(selector => {
const el = doc.querySelector(selector);
if (el) {
elementHandler[selector].map(callback => {
callback(new _Element(el));
});
}
});
return new Response(doc.toString(), response);
};
return {
on,
transform
};
}
解决方案
由于HTMLRewriter()
使用 调用new
,因此该函数需要是构造函数。在 JavaScript 中,构造函数应该设置属性this
并且不应该返回值。但是,您的函数被编写为返回一个值。
所以,试着改变这个:
return {
on,
transform
};
对此:
this.on = on;
this.transform = transform;
推荐阅读
- spring - spring @JmsListener 非编译时替换
- android - 安装应用程序时永远不会调用 FirebaseMessagingService
- python-3.x - RDP 上的 Pyautogui
- excel - 用分隔符连接一个(!)行
- kotlin - 如何将Object类型的Observable设置为接口中方法的返回值
- asp.net-mvc - Internet Explorer 中的防伪令牌问题
- html - 在 html 中删除移动视图中的额外空白
- json - 如何使用 jq 更新 json 文档中的单个整数?
- reactjs - 当用户从反应 js 应用程序中的不同选项卡返回页面时调用函数
- ag-grid - 有人可以帮助我使用 ag-grid 的 tabToNextCell 方法的默认代码吗