首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HTMLRewriter测试cloudflare worker失败,因为其未定义

使用HTMLRewriter测试cloudflare worker失败,因为其未定义
EN

Stack Overflow用户
提问于 2020-09-11 03:43:02
回答 1查看 340关注 0票数 1

我有一个测试我的cloudflare worker的测试,看起来像这样:

代码语言:javascript
运行
复制
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!'});
    });
});

在我的worker中,我这样做:

代码语言:javascript
运行
复制
 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);

现在,当我运行我的测试时,我得到这个错误消息:

代码语言:javascript
运行
复制
  ● 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如下所示:

代码语言:javascript
运行
复制
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
    };
}
EN

回答 1

Stack Overflow用户

发布于 2020-09-17 01:26:53

由于使用new调用HTMLRewriter(),因此该函数需要是一个构造函数。在JavaScript中,构造函数应该在this上设置属性,而不应该返回值。但是,您的函数是用来返回值的。

因此,尝试更改以下内容:

代码语言:javascript
运行
复制
return {
    on,
    transform
};

要这样做:

代码语言:javascript
运行
复制
this.on = on;
this.transform = transform;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63836671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档