Falha ao executar 'postMessage' em 'DOMWindow'

Procurei no fórum por uma resposta para este problema e tentei algumas das diferentes opções postadas.

Estou executando uma publicação do Ghost em um Digital Ocean Droplet e um fórum Discourse em um Digital Ocean Droplet separado, pois o consenso do fórum parecia ser que você não deveria instalar dois aplicativos no mesmo servidor.

forum.mysite ponto com
mysite ponto com

Gostaria que os comentários do Discourse aparecessem em cada postagem, e eu não tenho um slug de URL mysite.com/blog. Então, segui a documentação para obter o URL do site atual e usá-lo como o URL de incorporação.

Seguindo a documentação aqui: Documentação Oficial de Integração

Consigo fazer o frame aparecer em qualquer postagem nova. No entanto, ele não carrega e fornece o seguinte erro:
Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('<URL>') does not match the recipient window's origin ('<URL>').

Confirmei que minhas configurações HTTPS estão corretas. Meu URL incorporado imita o tutorial, mas tentei algumas variações diferentes de discourseEmbedUrl: na tentativa de solucionar o problema. Todas as referências ao URL do artigo atual estão causando o mesmo erro.

Também tentei adicionar uma função de espera, pensando que talvez o frame não tivesse carregado, mas o mesmo erro persiste.

Este é o meu código de incorporação atual:

<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>

Qualquer ajuda aqui seria apreciada, pois esgotei todas as soluções postadas. Acredito que possa ter a ver com o meu fórum e artigos estarem em máquinas separadas.

1 curtida

Olá @Joseph3 :wave: bem-vindo ao Discourse Meta :slight_smile:

você já viu este tópico?

2 curtidas

Oi Lilly, sim, eu também segui esse tutorial para verificar se a instalação do Discourse hospedada pelo Ghost era a mesma.

Tentei usar a referência de URL deles como abaixo:

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

Há algo incorreto aí?

Também, mas resultou no mesmo erro. Obrigado pela sua pronta resposta.

1 curtida

Este é um erro bastante comum: Search results for 'Failed to execute 'postMessage' on 'DOMWindow'' - Discourse Meta. É um tiro no escuro, mas uma causa possível do erro é não ter preenchido a configuração “Nome de usuário para criação de tópico” que se encontra na página de configurações de incorporação do Discourse.

Isso não deve causar um problema.

Algo que pode causar problemas é se o seu site Discourse for privado: Embed Discourse comments on another website via Javascript.

2 curtidas

Olá Simon, originalmente eu tinha o problema de não ter o nome de usuário para criação de tópicos correto no painel de administração do Discourse. Mas eu o corrigi para mostrar JosephPaul no painel, bem como dentro de:
\u003cmeta name='discourse-username' content='JosephPaul'\u003e

Então, esses estão corretos, ao meu ver.

Eu também dei uma olhada no segundo link que você enviou, e acredito que tudo está correto. Eu acabei de tentar mudar meu site Discourse para não exigir login e isso não resolveu o problema.

O problema persiste mesmo com posts recém-gerados.

Editar:
Eu tentei novamente seguir algumas das alterações sugeridas na URL de incorporação na postagem acima. O seguinte código está recriando o erro:

\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

Tentativa adicional de solução de problemas seguindo o tópico de Simon:

Eu defini a URL de incorporação para incluir também www. como um usuário sugeriu. O seguinte erro agora ocorre:

Referer:`https://josephpaul.com/test-post/`
O referer não foi enviado ou não correspondeu a nenhum dos seguintes hosts:

josephpaul.com
1 curtida

Alguma ideia sobre isso, Simon? Ficarei feliz em fornecer quaisquer saídas ou exemplos de código que você precise.

Envie-me uma mensagem privada com um link para uma postagem de blog que tenha o código de incorporação e eu darei uma olhada.

Para reduzir a causa do problema, seria ótimo se você pudesse tentar adicionar o código de incorporação encontrado em sua página de incorporação do Discourse sem modificações, além de substituir EMBED_URL pelo URL da página do blog.

2 curtidas

Oi Simon, claro, ficarei feliz em enviar um trecho, bem como um link para o site ativo. Como faço para enviar uma mensagem direta no Discourse? Talvez meu nível de confiança não seja alto o suficiente.

A documentação dizia para clicar no seu nome e um pop-up com a mensagem apareceria, mas não vejo isso do meu lado.

Obrigado novamente pela ajuda até agora! Com certeza atualizarei minha pergunta com qualquer solução que for alcançada.

Solução Encontrada - Obrigado a @simon e @Lilly por uma experiência de suporte incrível.

Itens que foram alterados de acordo com o conselho de Simon:

Alterado o código do tutorial para não incluir termos obsoletos e incluir a instrução 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>

Adicionalmente, adicionado https://www.test.com & https://test.com
À configuração src da política de segurança de conteúdo do site Discourse, encontrada na aba de configurações do admin do Discourse.

Observação - Na minha experiência, recarregar a página muito rapidamente em um droplet pequeno pode fazer com que você não veja os resultados por cerca de 30 segundos, então dê um tempo para que cada reinicialização do ghost e edição no painel de administração do Discourse façam efeito.

Observação Adicional - Há uma longa latência ao verificar a seção de comentários de qualquer artigo pela primeira vez, @simon recomenda sempre verificar o artigo você mesmo primeiro, para que o discourse tenha tempo de gerar as seções de comentários associadas à postagem do fórum.

Obrigado novamente a todos, muito útil. Muitos comentaristas do YouTube no tutorial que assisti tiveram os mesmos problemas que eu, que faziam referência às instruções de integração do discourse/ghost. Os links do YouTube podem estar obsoletos, então esta ajuda foi ótima.

4 curtidas

Fico feliz que você tenha conseguido fazer funcionar agora. :+1: O embedding é um pouco complicado porque não é exatamente o mesmo para cada configuração. Obrigado por compartilhar sua experiência, aprendi com isso. Além disso, o @simon é incrível e uma das pessoas mais legais, inteligentes e prestativas que tive o prazer de conhecer. E ele também é muito bom com o Discourse. :slight_smile:

3 curtidas

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