Chrome扩展content script的sendResponse无法到达service worker的sendMessage回调
问题解决方法
核心原因(最高概率)
你的content script的chrome.runtime.onMessage监听函数没有主动调用sendResponse方法,即使没有返回数据也需要显式调用,否则Chrome不会触发sendMessage的回调函数。
示例正确写法:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { // 你的处理逻辑 console.log('收到消息', message) // 必须调用这一行,哪怕返回空对象 sendResponse({}) })
其他排查方向
- 如果你使用的是Manifest V3版本,优先使用Promise写法替代回调写法,部分版本的MV3对回调写法的兼容性存在问题:
// background.js中写法 chrome.tabs.sendMessage(tabId, {color: "FOO"}) .then(resp => console.log('收到返回', resp)) .catch(err => console.error('报错', err)) - 检查是否存在多个
chrome.runtime.onMessage监听器,多个监听器同时存在时只有第一个调用sendResponse的监听器会生效,其余监听器如果没有处理返回会导致回调阻塞。 - 手动调用测试时修正回调写法,你之前的写法
resp=>console.log没有执行打印逻辑,正确写法为resp=>console.log(resp),同时确认你使用的标签页ID正确,且该标签页不是chrome://开头的内置页面、扩展商店页面或者隐私模式下的受限页面。 - 确认你在
manifest.json中声明了对应站点的host权限,以及content script的matches规则匹配你测试的站点。
内容的提问来源于stack exchange,提问作者pcr
相关产品推荐
相关产品推荐

