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

Chrome扩展sendMessage返回undefined问题求助

Chrome扩展MV3中sendMessage响应undefined的解决方法

问题根源在于chrome.runtime.onMessage监听器的异步处理逻辑:当监听器内部包含异步操作(比如你的代码中通过getTabUrl().then(...)获取标签页信息)时,必须让监听器函数返回true,否则Chrome会在监听器函数执行完毕后立即关闭消息通道,后续调用sendResponse时无法将数据传递到content脚本,导致content.js中收到的response为undefined。

修改后的background.js代码

async function getTabUrl() {
    const [tab] = await chrome.tabs.query(
        { active: true, lastFocusedWindow: true });
    return tab;
}

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    console.log("R: ", request);
    if (request === "get_url") {
        getTabUrl().then(tab => {
            if (tab) {
                console.log(tab.id);
                sendResponse(tab.id);
            }
        });
        // 关键:返回true告知Chrome保持消息通道开放,等待异步响应完成
        return true;
    }
});

可选优化(使用async/await简化逻辑)

async function getTabUrl() {
    const [tab] = await chrome.tabs.query(
        { active: true, lastFocusedWindow: true });
    return tab;
}

chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) => {
    console.log("R: ", request);
    if (request === "get_url") {
        const tab = await getTabUrl();
        if (tab) {
            console.log(tab.id);
            sendResponse(tab.id);
        }
        return true;
    }
});

核心说明:返回true是MV3中处理异步消息响应的强制要求,它会通知Chrome保留消息通道,直到sendResponse被调用完成,确保content脚本能正确接收到响应数据。

内容的提问来源于stack exchange,提问作者engineer-x

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:25:25