如何解决Chrome扩展调用TextRazor API时的CORS及请求报错问题
Chrome扩展TextRazor调用问题排查方案
1 Cloudflare Worker代理报错Please specify a TextRazor request.
该报错的核心原因是TextRazor服务未接收到符合格式的请求,可按以下顺序排查:
- 确认前端发起的请求为POST方法,
Content-Type固定为application/x-www-form-urlencoded,请求体必须包含apiKey、extractors两个必填参数 - 检查Worker转发逻辑,必须完整透传原始请求体,不要做二次序列化/反序列化处理,同时手动覆盖请求头:
- 将
Host设置为api.textrazor.com - 删除浏览器自带的
Origin、Referer等非必要请求头,避免触发TextRazor的校验规则
- 将
- 可在Worker中增加日志打印转发前的请求参数,和Postman直接调用TextRazor成功的请求参数做比对,确保完全一致
2 chrome.runtime.sendMessage严格模式报错
Chrome扩展的background脚本默认运行在严格模式下,该报错是因为回调中访问了严格模式禁止的caller、callee、arguments属性,修复方案如下:
- 调整
content.js的消息发送逻辑,不要在回调中使用arguments对象,直接显式声明回调参数,示例写法:
// content.js 正确调用示例 chrome.runtime.sendMessage( { type: 'fetchTextRazor', content:待分析文本 }, (result, err) => { // 直接使用声明的result、err参数,不要访问arguments对象 if (result?.entities) { // 处理返回的实体数据 } } )
- 调整
background.js的消息监听逻辑,异步调用接口后调用sendResponse时,必须在监听回调末尾加return true保持消息通道开放,示例写法:
// background.js 正确监听示例 chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.type === 'fetchTextRazor') { // 发起跨域请求 fetch('https://api.textrazor.com/', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-TextRazor-Key': '你的TextRazor密钥' }, body: `extractors=entities&text=${encodeURIComponent(msg.content)}` }).then(res => res.json()).then(data => { sendResponse({ entities: data.response?.entities || [] }) }) // 异步返回必须加return true return true } })
- 确认
manifest.json中配置了host_permissions,包含https://api.textrazor.com/*权限,否则background发起的请求会被扩展权限拦截
内容的提问来源于stack exchange,提问作者Bodoque
相关产品推荐
相关产品推荐

