Sentry-javascript: Evento: rejeição de promessa sem erro capturada com as chaves: currentTarget, isTrusted, target, type

Criado em 20 abr. 2020  ·  21Comentários  ·  Fonte: getsentry/sentry-javascript

Pacote + Versão

  • [x] @sentry/browser
  • [] @sentry/node
  • [] raven-js
  • [] raven-node _ (raven para o nó) _
  • [ ] de outros:

Versão:

5.10.2

Descrição

Meu projeto geralmente detecta um erro como rejeição de promessa de evento sem erro capturada com as chaves: currentTarget, isTrusted, target, type, sem nenhuma informação útil. E um dado adicional é

__serialized__ = {
    currentTarget: [object Null], 
    isTrusted: [Circular ~], 
    target: head > script[type="text/javascript"], 
    type: error
}

se parece com uma instância de evento. Com as informações limitadas, não sei onde esse bug foi acionado, alguém encontrou o mesmo problema?

Needs Information

Comentários muito úteis

Este erro esgotou minha capacidade de cota.

Todos 21 comentários

Também começamos a ver isso nas últimas semanas. Eu só comecei a pesquisar isso, então não tenho mais detalhes sobre o que está causando isso.

O mesmo aqui, agora no Sentry v5.15.5.

Alguém pode fornecer algum link para este tipo de evento capturado no Sentry? Parece um erro de carregamento de script (observe o target que este evento foi acionado)

@kamilogorek, você pode me enviar o e-mail da sua empresa? Posso compartilhar exemplos de eventos.

Se você precisar de mais exemplos, posso enviar alguns também @kamilogorek - é só me avisar.

@sheelah sim por favor

@sheelah não há muito que possamos melhorar aqui, para ser honesto. JS não nos dá mais informações do que já fornecemos. Sempre que uma instância de um objeto de promessa é rejeitada, ele dispara o evento onunhandledrejection (o mesmo vale para onerror na descrição do OP).

https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event

No entanto, não há nada que impeça alguém de passar qualquer coisa aleatória lá.
Assim, um código como este Promise.reject("whatever") ou Promise.reject(jQueryBecauseWhyNot) é um código JS totalmente válido.

Sempre que encontramos algo que não é um valor primitivo, um objeto que contém o rastreamento de pilha (por exemplo, Error ) ou exceção interna do DOM, temos que voltar para a serialização de objeto simples e tentar extrair todas as informações que pudermos. disso. Você pode ver o arquivo eventbuilder.ts para obter uma lista de caminhos possíveis que esse "qualquer valor aleatório" passado ao manipulador de eventos pode seguir - https://github.com/getsentry/sentry-javascript/blob/master/packages/ navegador / src / eventbuilder.ts # L17 -L80

Infelizmente, não tenho certeza se podemos torná-lo mais genérico para lidar com mais tipos de entrada.
Se alguém tiver algum feedback sobre esse processo, estou totalmente aberto a sugestões.

(respondido aqui em vez de no seu e-mail, para manter a conversa pública para todos)

Das minhas observações:

  • Só acontece em várias versões recentes do Safari no celular ou desktop;
  • Tenho algumas bibliotecas instaladas em meu aplicativo da web, como ZXing e browser-image-compression , mas nenhum script de rastreamento de terceiros;
  • Parece ocorrer ao mesmo tempo em que uma chamada de API falha com um erro de rede (código 0).
  • No meu caso, é mais especificamente um ProgressEvent , não apenas um evento - que parece ser uma parte da biblioteca de solicitação HTTP (estou usando axios).
ADDITIONAL DATA

__serialized__ | {
    currentTarget: [object Null],
    isTrusted: [Circular ~],
    target: [object FileReader],
    type: error}
-- | --

Também acabei de receber um relatório com "Rejeição de promessa sem erro capturada com valor: nulo". Semelhante ao que @ anton-bot mencionou acima, o usuário afetado estava usando o Safari 13.1.2 no Mac OS X 10.15.6.

Dei uma olhada em meu código de aplicativo compilado para reject( chamadas em que um objeto possivelmente null é fornecido, mas não consegui encontrar nenhum, então queria saber se poderia ser uma extensão do navegador ou terceiro script de festa. Como não há rastreamento de pilha ou migalhas de pão, é muito difícil saber o que aconteceu exatamente.

Também tenho visto isso nas últimas duas semanas. Em nosso site, só vimos isso em páginas que usam a API JavaScript do Google Maps, então tenho a sensação de que pode estar relacionado a isso. Alguém mais está vendo isso em URLs que usam o Google Maps?

Editar: até agora, vimos o problema no iOS e Android

Editar: Dados adicionais:

{
  currentTarget: [object Null], 
  isTrusted: [Circular ~], 
  target: head > script[type="text/javascript"], 
  type: error
}

@asbjornh nope, não tenho o Google Maps na minha página

@kamilogorek Os dados adicionais do OP (e os meus) seriam causados ​​por algo como Promise.reject(new Event("error")) ? Ou os eventos do Sentry para essa situação sempre teriam cargas úteis que se pareciam com eventos do navegador?

Eu também estou recebendo o mesmo erro

Este erro esgotou minha capacidade de cota.

temos 289 eventos disso nas últimas 24h - e nossa página ainda nem está ao vivo ..

{
currentTarget: [object Null], 
isTrusted: [Circular ~], 
target: head > link, 
type: error
}

Estamos usando next.js

o mesmo aqui com cra 😅

Parece que esse problema é causado por algo mais ou menos assim:

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = reject;
  document.body.appendChild(script);
});

O gancho onerror realmente receberá um objeto Event , em vez de uma instância Error , que está causando os problemas mencionados acima. Isso pode ser evitado envolvendo Event com Error conforme sugerido por https://developer.mozilla.org/de/docs/Web/API/HTMLScriptElement :

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = event => {
    reject(new Error(`Failed to load ${event.target.src}`));
  };
  document.body.appendChild(script);
});

No meu caso, foi o mecanismo de pré-busca 9.5.2 Next.js causando isso no Firefox, apenas no caso de alguém ter um caso semelhante. (talvez aqui? https://github.com/getsentry/sentry-javascript/issues/2546#issuecomment-697771381) Este é o problema: https://github.com/vercel/next.js/pull/16757 e pode ser resolvido atualizando para 9.5.3 ou Canário.

O erro é muito mais detalhado no navegador:

Uncaught (in promise) 
error
bubbles: false
...
...
as: "fetch"
assignedSlot: null
attributes: NamedNodeMap(3
0: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
1: rel="prefetch"
2: as="fetch"
as: as="fetch"
href: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
length: 3
rel: rel="prefetch"
...
...
​
isTrusted: true
originalTarget: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">
returnValue: true
srcElement: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">​
target: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">
timeStmp: 25366
type: "error"
...

Como podemos fazer com que o Sentry capture esses dados?

@ Turbo87 SIM! É exatamente por isso que só o vemos em páginas que usam @googlemaps/js-api-loader . Eles estão fazendo exatamente o que você está descrevendo aqui

Obrigada!!

Esta página foi útil?
0 / 5 - 0 avaliações