You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展Manifest V3消息传递无法将响应回传background问题

Chrome Manifest V3 消息无法回传问题解决方案

问题原因

  • chrome.tabs.sendMessage参数使用错误:Manifest V3 中该方法的第三个参数为可选配置项,传入null会导致部分Chrome版本参数解析异常,回调函数无法正常触发接收返回值。
  • 消息监听端口提前关闭:Chrome默认会在chrome.runtime.onMessage监听器执行结束后关闭消息端口,Manifest V3的service worker环境下即使同步调用sendResponse,也可能出现端口提前关闭导致响应无法回传的问题。

修正方案

1. 修改background.js代码

删除chrome.tabs.sendMessage的第三个null参数,修正后代码如下:

const actions = {
    GET_BUTTON_FROM_DOM: {
        REQUEST: 'getButtonFromDOMRequest',
        RESPONSE: 'getButtonFromDOMResponse',
    }
}

const sendMessage = (type, payload) => {
    chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
        chrome.tabs.sendMessage(
            tabs[0].id,
            { type, payload },
            (e) => { alert(); console.log(e) }
        );
    });
};

chrome.action.onClicked.addListener(tab => sendMessage(actions.GET_BUTTON_FROM_DOM.REQUEST, null));

2. 修改content.js代码

在消息监听器对应分支新增return true,告知Chrome保持消息端口开放等待响应发送完成,修正后代码如下:

const actions = {
    GET_BUTTON_FROM_DOM: {
        REQUEST: 'getButtonFromDOMRequest',
        RESPONSE: 'getButtonFromDOMResponse',
    }
}

chrome.runtime.onMessage.addListener((rq, sender, sendResponse) => {
    console.log(rq, sender);
    console.log(sendResponse);
    switch (rq.type) {
        case actions.GET_BUTTON_FROM_DOM.REQUEST:
            console.log('correct case');
            sendResponse({ x: 'ahoj' })
            return true;
        default:
            console.log('Invalid event type!');
    }
});

补充检查项

如果修正后仍存在问题,可以检查manifest.json配置:

  • 确认content_scripts配置的匹配规则覆盖当前测试的页面地址
  • 确认已声明所需的host权限,例如"host_permissions": ["<all_urls>"]

内容的提问来源于stack exchange,提问作者Branislav Blazek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:04