google chrome extension - las - Error de puerto: no se pudo establecer la conexión. El extremo receptor no existe. En Chromiume
google tag assistant español (12)
Estoy desarrollando una extensión en Chrome, y hay un problema. En mi inject.js
, hago una solicitud como:
chrome.extension.sendRequest({command:''skip''},callback)
y en mi `background.js simplemente agrego un Listener de solicitud como:
chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"})
Pero hay un error:
Error de puerto: no se pudo establecer la conexión. El final receptor no existe
Parece un error en Chrome? PD:
parte de mi manifest.json
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["< all_urls >"],
"js": ["inject.js"]
}
],
Estoy en Chromium 17 e intenté volver a cargar la extensión, reabrir el navegador ... no pasó nada
alguien tiene algunas ideas?
Consulte los manuales más recientes: http://developer.chrome.com/extensions/messaging.html
Nota: Si varias páginas están escuchando eventos onMessage, solo el primero en llamar a sendResponse () para un evento en particular logrará enviar la respuesta. Todas las otras respuestas a ese evento serán ignoradas.
Cierre sus pestañas, deje solo una página y verifique. En mi caso, este era el problema.
Después de un tiempo dedicado a la investigación, encontré el problema en mi caso.
También estoy obteniendo:
Port error: Could not establish connection. Receiving end does not exist.
Antes de explicar, quiero decir que estoy usando sendMessage y onMessage para la comunicación.
En mi caso, este error aparece cuando envío un mensaje desde la página de fondo a una pestaña donde se ejecuta mi secuencia de comandos de contenido.
Mi extensión se ejecuta solo en pestañas donde youtube está abierto. Entonces, cuando estoy cambiando algunas preferencias, quiero ver qué pestañas tengo abiertas y enviar un mensaje para actualizar las preferencias actualizadas.
En un caso normal, funciona bien, pero si tengo n (n> = 1) pestañas con youtube abierto. Hago clic en el botón "Volver a cargar" para la extensión, cambio algo ... las pestañas de youtube no se actualizan y pierden el receptor de mensajes, así que estoy recibiendo este error.
Parece que es bastante normal.
Si actualizo las pestañas de youtube después de la recarga de la extensión, no obtengo este error.
Encontré una solución, es posible que no se aplique en todos los casos:
Cuando tuve este problema, mi código fue:
chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}, function(response) {});
Ahora mi código es:
chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue});
Para mi no necesité devolución de llamada de respuesta y porque eso no respondía, tuve este error.
El problema podría ser que y sendRequest()
hayan quedado obsoletos y reemplazados por onRequest
sendMessage()
y onMessage
. Desde una reciente actualización de Chrome 20 parece que se han ido por completo.
La documentación oficial en Message Passing ya no menciona . sendRequest()
Aquí hay un enlace que documenta el cambio un poco: http://codereview.chromium.org/9965005/
Enfrentando con el mismo problema ahora.
// Aquí está mi antiguo 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)
Verá, el chrome.runtime.onMessage.addListener se activa cuando el evento onInstalled se vuelve feliz, y cuando lo saco de este ámbito, y hago mi código así:
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
});
}
});
Funciona bien ahora. Espero ser útil.
Esta no siempre es la causa, pero si tienes un error en tu background.js
, deberías revisar este enlace:
Inspect views: _generated_background_page.html
en la página Extensiones, que le mostrará los errores de JavaScript.
Esto impedía que mis conexiones se establecieran.
Estaba viendo este error usando manifest_version: 2
y chrome.runtime.sendMessage
. Me estoy conectando de una página web a la extensión en lugar de dentro de la extensión.
La solución fue asegurarme de tener los valores correctos en la matriz externally_connectable.matches
en manifest.json. Debe enumerar las URL que desea que puedan conectarse a la extensión. Ver https://developer.chrome.com/extensions/manifest/externally_connectable#without-externally-connectable .
Estaba viendo este problema, donde mi script de contenido no se estaba cargando, por lo que nunca se publicó un mensaje.
El problema fue que tenía el inspector de scripts de fondo abierto y solo estaba presionando Cmd + R (actualización), pero había un error en mi manifest.json
. Cuando en realidad fui a la página de extensiones y volví a cargar esa página, recibí la alerta que mostraba el error manifiesto.
Básicamente, vi esto porque mis guiones de contenido nunca se cargaron en primer lugar y pensé que estaba refrescando mi manifiesto, pero no lo estaba.
Estoy usando sendMessage y onMessage para la comunicación también, y en mi flujo de trabajo primero envío un mensaje desde injected.js a mi background.js y también recibí "Error de puerto: no se pudo establecer la conexión. El extremo de recepción no existe". error.
Así que decidí tratar con el uso de las funcionalidades de las respuestas (como ACK ), y si el fondo no responde, sigo intentando con un setTimeout como tal.
//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();
Mi código ahora se está ejecutando correctamente, así que creo que la explicación es fácil de ver. Chrome no prepara Background.js y material de conexión cuando inyecta su código en las páginas donde desea, y por lo tanto no hace que nadie escuche su mensaje enviado, de modo que si nadie está escuchando, siga intentando como yo.
Me encontré teniendo el mismo problema que describes aquí. La solución que encontré que funciona para mí es usar una página de fondo en lugar de una secuencia de comandos de fondo, así:
"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"]
},
*/
Espero que esto funcione para ti también.
Si obtiene el problema, principalmente porque está refiriendo el documento obsoleto, ¡actualícelo!
Una página de fondo HTML no funcionó para mí en Chrome 20.0.1132.57 m en Windows 7 con el mismo error:
Port error: Could not establish connection. Receiving end does not exist. miscellaneous_bindings:232
Intenté usar una secuencia de comandos background.js
con el siguiente contenido:
chrome.extension.onConnect.addListener(function(port) {
port.onMessage.addListener(function(msg) {
// May be empty.
});
});
Eso resolvió el onDisconnect
inmediato en mi secuencia de comandos de contenido:
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.
});
El código correcto proviene del ejemplo de mensajes de extensiones de Chromium: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/timer/page.js?view=markup
El ejemplo también contiene la segunda parte que sirve de backend para sendRequest
, pero no lo he probado yo mismo:
chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
// Don''t know if it may be empty or a sendResponse call is required.
});
intenta insertar algunos scripts contectos en una pestaña cuya URL es chrome: // * o https://chrome.google.com/* , cuando conectes estas pestañas en la página de fondo,
por ejemplo
chrome.tabs.connect(tab.id).postMessage(msg)
luego arrojará
Port error: Could not establish connection. Receiving end does not exist.
estas páginas no permiten la inyección de scripts de contenido, y la conexión se desconectará de inmediato.
entonces, verifique la url y no conecte estas pestañas, entonces la excepción no se arroja