Error al ejecutar 'postMessage' en 'DOMWindow'

He buscado en el foro una respuesta a este problema y he probado algunas de las diferentes opciones publicadas.

Estoy ejecutando una publicación de Ghost en un Digital Ocean Droplet y un foro de Discourse en un Digital Ocean Droplet separado, ya que el consenso del foro parecía ser que no se deben instalar dos aplicaciones en el mismo servidor.

forum.mysite punto com
mysite punto com

Me gustaría que los comentarios de Discourse aparecieran en cada publicación y no tengo una URL de slug mysite.com/blog. Así que seguí la documentación para obtener la URL del sitio actual y usarla como URL de incrustación.

Siguiendo la documentación aquí: Documentación oficial de integración

Puedo hacer que el marco aparezca en cualquier publicación nueva. Sin embargo, no se carga y proporciona el siguiente error:
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('<URL>') does not match the recipient window's origin ('<URL>').

He confirmado que mi configuración HTTPS es correcta. Mi URL incrustada imita el tutorial, pero probé algunas variaciones diferentes de discourseEmbedUrl para intentar solucionar el problema. Todas las referencias a la URL del artículo actual causan el mismo error.

También intenté agregar una función de espera, pensando que quizás el marco no se cargó, pero el mismo error persiste.

Este es mi código incrustado actual:

<div id='discourse-comments'></div>
<meta name='discourse-username' content='JosephPaul'>

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'https://forum.mysite.com/',
    discourseEmbedUrl: '{{url absolute="true"}}',
    // className: 'CLASS_NAME',
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

Cualquier ayuda aquí sería apreciada, ya que he agotado todas las soluciones publicadas. Creo que puede tener que ver con que mi foro y mis artículos estén en máquinas separadas.

1 me gusta

Hola @Joseph3 :wave: bienvenido a Discourse Meta :slight_smile:

¿ya viste este tema?

2 Me gusta

Hola Lilly, sí, seguí ese tutorial también para verificar que la instalación de Discourse alojada por Ghost fuera la misma.

He intentado usar su referencia de URL como se muestra a continuación:

discourseEmbedUrl: 'https://mysite.com<%= current_page.url %>'

¿Hay algo incorrecto ahí?

También, pero resultó en el mismo error. Gracias por tu pronta respuesta.

1 me gusta

Este es un error bastante común: Search results for 'Failed to execute 'postMessage' on 'DOMWindow'' - Discourse Meta. Es una posibilidad remota, pero una causa posible del error es no haber completado la configuración “Nombre de usuario para la creación de temas” que se encuentra en la página de configuración de incrustación de Discourse.

Eso no debería causar un problema.

Algo que puede causar problemas es si tu sitio de Discourse es privado: Embed Discourse comments on another website via Javascript.

2 Me gusta

Hola Simon, originalmente tuve el problema de no tener el nombre de usuario correcto para la creación de temas en el panel de administración de Discourse. Pero lo corregí para que aparezca JosephPaul en el panel, así como en:
\u003cmeta name='discourse-username' content='JosephPaul'\u003e

Así que esos están correctos, hasta donde sé.

También eché un vistazo al segundo enlace que enviaste, y creo que todo está correcto. Acabo de intentar cambiar mi sitio de Discourse para que no requiera inicio de sesión y eso no resolvió el problema.

El problema persiste incluso con publicaciones recién generadas.

Editar:
He intentado nuevamente seguir algunos de los cambios sugeridos en la URL de incrustación en la publicación anterior. El siguiente código está recreando el error:

\u003cscript type="text/javascript"\u003e

setTimeout(5000)
  DiscourseEmbed = {
    discourseUrl: 'https://forum.josephpaul.com/',
    discourseEmbedUrl: 'https://josephpaul.com{{page.url}}' };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
\u003c/script\u003e

Intento de solución de problemas adicional siguiendo el hilo de Simon:

He configurado la URL de incrustación para que también incluya www. como sugirió un usuario. Ahora ocurre el siguiente error:

Referer:`https://josephpaul.com/test-post/`
El referer no se envió o no coincidió con ninguno de los siguientes hosts:
josephpaul.com
1 me gusta

¿Alguna idea al respecto, Simon? Estaré encantado de proporcionarte cualquier salida o ejemplo de código que necesites.

Envíame un mensaje privado con un enlace a una publicación de blog que tenga el código de inserción y lo revisaré.

Para reducir la causa del problema, sería genial si pudieras intentar agregar el código de inserción que se encuentra en tu página de inserción de Discourse sin modificaciones, aparte de reemplazar EMBED_URL con la URL de la página del blog.

2 Me gusta

Hola Simon, claro que te enviaré un fragmento y un enlace al sitio en vivo. ¿Cómo envío un mensaje directo en Discourse? Quizás mi nivel de confianza no es lo suficientemente alto.

La documentación decía que hiciera clic en tu nombre y aparecería una ventana emergente con un mensaje, pero no veo eso de mi lado.

¡Gracias de nuevo por la ayuda hasta ahora! Me aseguraré de actualizar mi pregunta con la solución que se alcance.

Solución encontrada - Gracias a @simon y @Lilly por una experiencia de soporte increíble.

Elementos que se modificaron según el consejo de Simon:

Se modificó el código del tutorial para que no incluyera términos obsoletos y se añadiera una sentencia if:


<div id='discourse-comments'></div>
<meta name="discourse-username" content="ForumAdminName">

<script type="text/javascript">
  if (window.location.pathname.indexOf('/p/') < 0) {
  DiscourseEmbed = {
    discourseUrl: 'https://forum.test.com/',
    discourseEmbedUrl: '{{url absolute="true"}}',
    // className: 'CLASS_NAME',
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
}
</script>

Además, se añadieron https://www.test.com y https://test.com
A la configuración src de la política de seguridad de contenido del sitio de Discourse, que se encuentra en la pestaña de administración de Discourse > configuración.

Nota: En mi experiencia, si actualizas la página demasiado rápido en un droplet pequeño, es posible que no veas los resultados durante unos 30 segundos, así que dale unos momentos a cada reinicio fantasma y a cada edición del panel de administración de Discourse para que surtan efecto.

Nota adicional: Hay una latencia considerable al comprobar la sección de comentarios de cualquier artículo por primera vez. @simon recomienda comprobar siempre tú mismo el artículo primero, para que Discourse tenga tiempo de generar las secciones de comentarios asociadas a la publicación del foro.

De nuevo, gracias a todos, muy útil. Muchos comentaristas de YouTube en el tutorial que vi tuvieron los mismos problemas que yo, que hacían referencia a las instrucciones de integración de Discourse/Ghost. Los enlaces de YouTube pueden estar obsoletos, así que esta ayuda fue genial.

4 Me gusta

Me alegro mucho de que ahora funcione. :+1: la incrustación es un poco complicada porque no es exactamente igual para cada configuración. Gracias por compartir tu experiencia, he aprendido de esto. Además, @simon es increíble y una de las personas más agradables, inteligentes y serviciales que he tenido el placer de conocer. Y además, se le da bastante bien Discourse. :slight_smile:

3 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.