Los comentarios de Discourse se quedan atascados en "Loading..."

Hola,

En los últimos días, en nuestro Discourse, hemos notado que el botón “View Full Post” (Ver publicación completa) permanece en “Loading…” (Cargando…) cuando se hace clic en él:

Además, los nuevos comentarios de Discourse han dejado de mostrarse en nuestro embed desde nuestro sitio web de Drupal. Hemos estado utilizando con éxito las instrucciones de incrustación de JavaScript de abajo durante años:

Sin embargo, por alguna razón, esto parece haber dejado de funcionar últimamente. Creo que la última publicación que funcionó fue alrededor del día 1 de este mes. Las publicaciones antiguas se muestran en Discourse y en el módulo de incrustación, pero en los artículos más recientes, el bloque de Discourse se queda colgado en el texto “Loading…”.

Nuestro módulo de Discourse Drupal se carga desde el siguiente código:

<div id="discourse-comments">
 <script type="text/javascript">
            var discourseUrl = "https://discourse.sitename.com/",
            discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

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

He confirmado que el archivo “javascripts/embed.js” todavía existe en la misma ruta.
Este es el bloque que se muestra en las páginas de artículos; últimamente solo muestra “Loading Discussion…” (Cargando discusión…):
image

No hemos realizado ningún cambio en los últimos años en nuestra incrustación o configuración de Discourse. ¿Ha habido algún cambio reciente en la funcionalidad de Discourse que pudiera romper esto? ¡Cualquier ayuda para solucionar esto sería muy apreciada!

2 Me gusta

usamos la misma funcionalidad de incrustación en nuestro sitio. supongo que discourseUrl y discouseEmbedUrl no son lo que publicaste arriba y en cambio son las URL relevantes de tu foro?

de lo contrario, el código se ve bien. sé que la funcionalidad de incrustación está funcionando para la versión beta actualizada de Discourse. hemos tenido muchísimas publicaciones incrustadas esta semana. me parece extraño que incruste la primera parte de la publicación pero el botón “mostrar publicación completa” no funcione. las nuestras se cargan inmediatamente :thinking:

¿revisaste la consola en busca de errores?

siempre puedes intentar deshabilitar la configuración embed_truncate solo para ver si publica todo el texto. eso podría ayudar a reducir la causa del problema.

¿Ha actualizado o cambiado algún tema recientemente? ¿O realmente quiere decir que no ha actualizado en años?

1 me gusta

Sí, es correcto, usé el marcador de posición sitename solo para mayor claridad.
Vaya, bueno, ¡es un alivio que parezca que la funcionalidad de incrustación de Discourse no está rota! Debe ser algo de nuestro lado.

Revisé los registros de Discourse (discourse.sitename.com/logs) y solo veo muchas notificaciones de desaprobación como la siguiente:

Aviso de desaprobación: SiteSetting.enable_personal_messages ha sido desaprobado.

Definitivamente puedo intentar deshabilitar embed_truncate también, buscaré eso a continuación. Pero esa funcionalidad funcionó durante años sin problemas, así que no estoy seguro de por qué se rompería…

2 Me gusta

intenta mirar la consola de herramientas de desarrollador para ver si hay errores cuando haces clic en el botón “mostrar publicación completa”. Las herramientas de desarrollador se pueden acceder haciendo clic derecho e “inspeccionar”. Los errores aparecerán en rojo en el lado derecho.

Sí, la función de incrustación definitivamente no está rota. Es algo que ocurre varias veces al día en mi sitio.

La última beta es Discourse 3.1.0.beta4, la versión estable es 3.0.3: Security and bug fix release

2 Me gusta

Creo que nuestra configuración está gestionada; no le he hecho ningún cambio, pero nuestro panel de control de Discourse muestra una fecha de última actualización de Discourse del 18 de abril. Si observo el último anuncio vinculado a eso, parece que es la versión 3.0.3.

1 me gusta

asegúrate de que también estás ejecutando la última versión de Discourse. También podría valer la pena ver si está sucediendo lo mismo en modo seguro.

¡Esa es una buena idea, gracias! Acabo de revisar y veo este error:

Uncaught DOMException: Se especificó una cadena no válida o ilegal

postUp embed-application.js:6
onload embed-application.js:36
EventHandlerNonNull* embed-application.js:25
<anonymous> embed-application.js:66
[embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js:5](https://conversation.spectrummagazine.org/assets/embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js)
postUp embed-application.js:6
onload embed-application.js:36
(Async: EventHandlerNonNull)
<anonymous> embed-application.js:25
<anonymous> embed-application.js:66

Es muy extraño porque no hice ningún cambio en el código ni nada recientemente. Sin embargo, recuerdo que estaba usando Cloudflare el día 2 de este mes para fortalecer la seguridad; puede que necesite verificar si hay algo en ese extremo que esté bloqueando scripts.

Vi un error de CSP en la consola de Herramientas para desarrolladores la última vez que revisé esto, así que tal vez ese sea el problema, potencialmente del lado de Cloudflare.

1 me gusta

sospecho que algo tiene que ver con esto.

sé que cuando nuestro sitio principal editó su política de contenido en línea y su configuración de seguridad una vez, bloqueó nuestras incrustaciones durante unos días. sin embargo, el efecto fue diferente y bloqueó las incrustaciones en la otra dirección, no las publicó en nuestro foro.

1 me gusta

¡Oh, buena idea! ¿Sabes qué configuración de seguridad tuvo que modificarse para solucionar esto?
Hice algunos cambios, así que no estoy seguro de cuál debería revertir específicamente.

Ni idea, yo no gestiono esa parte del sitio. Tuve que llamar a la gente que lo aloja para que cambiara la configuración de la política de seguridad.

Sí, algo no está muy contento con que se haga clic en ese botón.

¡Pude identificar cuál era el problema! Me puse en contacto con nuestro soporte de Discourse y me proporcionaron una dirección IP que habíamos agregado previamente a una lista de bloqueo en nuestro WAF, debido a una gran cantidad de tráfico de esa dirección. Resulta que esa dirección IP debía permitirse para que Discourse pudiera comunicarse correctamente. ¡Me alegro mucho de que no fuera un problema del lado de Discourse!

5 Me gusta

Sí, un poco suena similar al problema que encontré. Me alegro de que lo hayas solucionado :slight_smile:

2 Me gusta

Creo que podría estar teniendo el mismo problema. Tengo estos errores DOMException en la consola de desarrollador de mi navegador. Sin embargo, no uso Cloudflare. Mi blog que incrusta el iframe de Discourse está alojado por Netlify, Discourse en sí por Communiteq.

Al principio pensé que este cambio estaba causando el problema:

¿Pero ahora creo que podría ser algo más? Cualquier ayuda sería apreciada.

¿Tienes acceso a la configuración de seguridad y/o de red desde tu servidor en Netlify? Por mi experiencia reciente, si estuviera en tu lugar, revisaría tu configuración de seguridad para ver si se ha bloqueado alguna dirección IP. Volvería a consultar con el soporte de Communiteq también, porque podrían confirmar la(s) dirección(es) IP necesarias para que tu servidor Netlify se comunique con Communiteq y ejecute correctamente los scripts necesarios para mostrar los recursos de Discourse.

1 me gusta

¡Hola! ¡Gracias por intentar ayudar!

Me he puesto en contacto con Communiteq.

No estoy seguro de lo que puedo hacer por parte de Netlify, pero lo investigaré. Sin embargo, dudo que el problema esté ahí, porque técnicamente las solicitudes provienen de los navegadores de los visitantes de mi sitio, ¿verdad? Si entiendo correctamente cómo funciona esto, y por favor, corrígeme si no es así, se trata de JavaScript del lado del cliente ejecutado en el navegador del visitante del sitio. Discourse ve el nombre del host del servidor en la solicitud, pero no la IP. Mi servidor de blog no se comunica con el servidor del foro. De todos modos, es una instalación de blog estática. Es solo HTML con JavaScript del lado del cliente. Utiliza un script para enviar los datos de la publicación del blog a Discourse y cargar elementos del foro en un iframe.

1 me gusta

El problema fue, de hecho, un error en la última versión de Discourse. Communiteq lo está corrigiendo en mi instancia del foro. Para más información, véase aquí:

Tenga en cuenta que este problema es diferente.

El problema en este tema era la incapacidad de Discourse para “Mostrar publicación completa” en Discourse porque el sitio incrustado se negaba a servir el contenido de la publicación del blog a Discourse.

El problema en el tema de @fabsh es el resultado de un parche de seguridad (más reciente) en Discourse que contiene un problema.

3 Me gusta

Hola, publico una actualización sobre esto, ya que algunas cosas han cambiado en mi investigación sobre este problema. El problema persiste desde la actualización a la versión 3.0.4; todos los artículos recién creados tienen problemas para mostrar el código incrustado de Discourse. Todos los artículos creados antes de esta actualización no tienen ningún problema, por lo que no es un bloqueo de dirección IP lo que está causando esto.

Parece que Discourse, en la versión más reciente, ha cambiado la lógica de cómo se crean automáticamente las publicaciones mediante el código de incrustación, por lo que ahora el nuevo código requiere la URL canónica. Vea el tema enlazado anteriormente:

Sin embargo, esto rompe por completo la funcionalidad de incrustación en sitios como el mío. Anteriormente, utilizaba el ID de nodo en Drupal para incrustar, como se ve en el siguiente código:

discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

Este nuevo código de Discourse requiere que se utilice la URL canónica en su lugar, lo que da como resultado la creación de temas duplicados si alguien simplemente renombra el título del artículo. Esa es la razón por la que usaba el ID de nodo, porque no cambia.

¿Sería posible que esta nueva URL canónica fuera opcional? Intenté cambiar mi código de incrustación para usarla, pero el problema de carga volvió para todas las publicaciones creadas con el código de incrustación antiguo.

Entonces, ahora mismo, con el nuevo código de Discourse ejecutándose en mi sitio de producción, me encuentro atrapado con una de estas dos opciones:

  • Los artículos recién creados en Drupal muestran “Cargando…” pero nunca cargan el bloque de incrustación de comentarios; los artículos antiguos creados antes de Discourse 3.0.4 se cargan bien.

O,

  • Los artículos recién creados en Drupal cargan el bloque de incrustación de comentarios sin problemas, pero todos los artículos antiguos creados antes de Discourse 3.0.4 muestran “Cargando…” pero nunca cargan el bloque de incrustación de comentarios.

¿Hay alguna manera de hacer que esta nueva función sea opcional? Tener que elegir entre una de estas opciones me pone en una situación en la que no gano.

2 Me gusta