端口错误:无法build立连接。 接收结束不存在。 在Chromiume

我正在开发一个扩展在Chrome中,并有一个问题。 在我的inject.js ,我提出了一个请求:

 chrome.extension.sendRequest({command:'skip'},callback) 

并在我的`background.js我只需添加一个请求监听器,如:

 chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"}) 

但是有一个错误:

端口错误:无法build立连接。 接收结束不存在

这似乎是一个铬的错误? PS:
我的manifest.json的一部分

 "background": { "scripts": ["background.js"] }, "content_scripts": [ { "matches": ["&lt all_urls &gt"], "js": ["inject.js"] } ], 

我在铬17,我试图重新加载扩展,重新打开浏览器…什么都没有发生
有人得到一些想法?

我发现自己遇到了与你在这里描述的相同的问题。 我发现这个解决scheme对我来说是使用backgroundpage而不是后台脚本,如下所示:

 "background_page": "src/background.html", // maybe this seems to work instead of background { scripts [] } /* this gives a Port error: Could not ... "background": { "scripts": ["src/background.js"] }, */ 

我希望这也适合你。

这并不总是原因,但是如果你在background.js有错误,你应该检查这个链接:

 Inspect views: _generated_background_page.html 

在扩展页面,它会显示任何JavaScript错误。

这阻止了我的连接build立。

问题可能是sendRequest()onRequest已被弃用,并被sendMessage()onMessage取代。 自从最近的Chrome 20更新以来,它们似乎完全消失了。

关于Message Passing的官方文档甚至没有提及sendRequest()

这是一个链接,它logging了一点变化: http : //codereview.chromium.org/9965005/

在Windows 7上的Chrome 20.0.1132.57 m中,HTML背景网页对我来说不起作用,同样的错误:

 Port error: Could not establish connection. Receiving end does not exist. miscellaneous_bindings:232 

我尝试使用以下内容的background.js脚本:

 chrome.extension.onConnect.addListener(function(port) { port.onMessage.addListener(function(msg) { // May be empty. }); }); 

解决了我的内容脚本中的立即onDisconnect

 port = chrome.extension.connect(); port.onDisconnect.addListener(function (event) { // Happened immediately before adding the proper backend setup. // With proper backend setup, allows to determine the extension being disabled or unloaded. }); 

正确的代码来自Chromium扩展消息示例: http : //src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/timer/page.js?view=标记

该示例还包含作为sendRequest的后端的第二部分,但我没有sendRequesttesting它:

 chrome.extension.onRequest.addListener( function(request, sender, sendResponse) { // Don't know if it may be empty or a sendResponse call is required. }); 

经过一段时间的调查,我发现在我的情况下的问题。

我也得到:

 Port error: Could not establish connection. Receiving end does not exist. 

在解释之前,我想说我正在使用sendMessageonMessage进行通信。

对于我来说,当我从背景页面发送消息到我的内容脚本正在运行的一个选项卡时,出现这个错误。

我的扩展程序仅在打开了YouTube的选项卡上运行。 所以,当我改变一些喜好,我期待看到我打开了什么标签,并发送消息更新更新的首选项。

在正常情况下,它工作正常,但如果我有n(n> = 1)与YouTube打开标签。 我点击“重新加载”button的扩展名,我改变了一些东西… YouTube的选项卡不刷新,他们失去了消息监听器,所以我得到这个错误。

看来这很正常。

如果我扩展重新加载后刷新YouTube标签,我不会得到这个错误。

我find了一个解决scheme,它可能不适用于所有情况:

当我遇到这个问题时,我的代码是:

 chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}, function(response) {}); 

现在我的代码是:

 chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}); 

对于我我不需要回应callback,因为这是没有回应我有这个错误。

我正在使用sendMessageonMessage进行通信,在我的工作stream程中,我首先发送了一个来自inject.js的消息给我的background.js,同时我还得到了“端口错误:无法build立连接,接收端不存在”。 错误。

所以我决定使用响应function(如ACK )来处理,如果背景没有响应,我会继续尝试setTimeout。

//background.js

 ... chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { ... //some code sendResponse({status: 'everything ok'}) return true; }); 

//injected.js

 var myInjectedFunctionality = function() { chrome.extension.sendMessage({method: "Steroids:loadScripts"}, function(res) { if(res && res.status) { } else { setTimeout(myInjectedFunctionality, 3000); } }); }; myInjectedFunctionality(); 

我的代码现在正常运行,所以我认为解释很容易查看。 Chrome在你想要的页面中注入你的代码时,不会准备好Background.js和连接的东西,所以没有人会监听你发送的消息,所以如果没有人在听,就像我一样继续尝试。

尝试注入一些标签脚本,其URL为chrome:// *https://chrome.google.com/* ,当在backgroundpage中连接这些标签时,

例如

 chrome.tabs.connect(tab.id).postMessage(msg) 

然后会抛出

 Port error: Could not establish connection. Receiving end does not exist. 

这些页面不允许注入内容脚本,连接将立即断开。

所以,检查url,而不是连接这些选项卡,然后抛出exception

查看最新的手册: http : //developer.chrome.com/extensions/messaging.html

注意:如果多个页面正在监听onMessage事件,则只有第一个为特定事件调用sendResponse()才能成功发送响应。 对该事件的所有其他响应将被忽略。

closures你的标签,只留下一个页面,并检查。 在我的情况下,这是问题。

现在面对同样的问题。

//这是我以前的background.js

 chrome.runtime.onInstalled.addListener(function () { //some other code here chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { if (message.url) { chrome.downloads.download({ url: message.url, conflictAction: 'uniquify', saveAs: false }); } });});//(Sorry, I tried but failed to put the last bracket on next line) 

你会发现,当onInstalled事件发生时, chrome.runtime.onMessage.addListener会被触发,当我把它从这个范围中拿出来,并且使我的代码如下所示:

 chrome.runtime.onInstalled.addListener(function () { //some other code here }); chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { if (message.url) { chrome.downloads.download({ url: message.url, conflictAction: 'uniquify', saveAs: false }); } }); 

现在运行良好。 希望能有所帮助。

如果您遇到问题,主要是因为您提到过时的文档,请更新它!

请访问: Chrome扩展程序:messaging.html

我看到这个问题,我的内容脚本没有加载,所以发布消息从来没有发生。

问题原来是我打开了后台脚本检查器,只是推Cmd + R(刷新),但是我的manifest.json有一个错误。 当我真的去了扩展页面并重新加载页面,我得到了显示错误的警报。

基本上,我看到这一点,因为我的内容脚本从来没有加载,我认为我刷新我的清单,但我没有。

我看到这个错误使用manifest_version: 2chrome.runtime.sendMessage 。 我从网页连接到扩展而不是在扩展中。

解决scheme是确保我在manifest.json中的externally_connectable.matches数组中具有正确的值。 您需要列出您希望能够连接到扩展的URL。 请参阅https://developer.chrome.com/extensions/manifest/externally_connectable#without-externally-connectable