Sentry-javascript: 事件:使用键捕获的非错误承诺拒绝:currentTarget、isTrusted、target、type

创建于 2020-04-20  ·  21评论  ·  资料来源: getsentry/sentry-javascript

套餐+版本

  • [x] @sentry/browser
  • [ ] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(节点的乌鸦)_
  • [ ] 其他:

版本:

5.10.2

描述

我的项目经常会遇到类似Event Non-Error promise reject之类的错误,用keys: currentTarget, isTrusted, target, type 捕获,没有任何有用的信息。 一个额外的数据是

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

看起来像一个事件实例。 信息有限,不知道哪里触发了这个bug,有没有人遇到过同样的问题?

Needs Information

最有用的评论

这个错误刚刚耗尽了我的配额容量。

所有21条评论

在过去的几周里,我们也开始看到这些。 我刚刚开始研究它,所以我没有更多关于导致它的原因的详细信息。

同样在这里,现在在 Sentry v5.15.5 上。

有人可以提供指向 Sentry 中捕获的此类事件的任何链接吗? 看起来像是脚本加载错误(注意target已触发此事件)

@kamilogorek能把你公司的邮箱发给我吗? 我可以分享事件的例子。

如果您需要更多示例,我也可以发送一些@kamilogorek - 请告诉我。

@sheelah是的,请

@sheelah说实话,我们在这里没有太多可以改进的地方。 JS 没有给我们更多我们已经提供的信息。 每当 promise 对象的实例被拒绝时,它就会触发onunhandledrejection事件(OP 描述中的onerror也是如此)。

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

然而,没有什么可以阻止任何人在那里传递任何随机的东西。
因此像Promise.reject("whatever")Promise.reject(jQueryBecauseWhyNot)代码是完全有效的 JS 代码。

每当我们遇到一些不是原始值的东西,一个包含堆栈跟踪的对象(例如Error )或内部 DOM 异常时,我们必须回退到简单的对象序列化并尝试提取我们可以得到的任何信息其中。 您可以看到eventbuilder.ts文件以获取传递给事件处理程序的“任何随机值”可以采用的可能路径列表 – https://github.com/getsentry/sentry-javascript/blob/master/packages/浏览器/src/eventbuilder.ts#L17 -L80

不幸的是,我不确定我们是否可以让它更通用来处理更多类型的输入。
如果有人对这个过程有任何反馈,我完全愿意接受建议。

(在此处回答而不是您的电子邮件,以保持对话对其他人公开)

根据我的观察:

  • 仅发生在移动或桌面上各种最新版本的 Safari 中;
  • 我的网络应用程序中安装了一些库,例如ZXingbrowser-image-compression ,但没有第三方跟踪脚本;
  • 它似乎与 API 调用因网络错误(代码 0)而失败的同时发生。
  • 就我而言,它更具体地说是一个ProgressEvent ,而不仅仅是一个事件——它似乎是 HTTP 请求库的一部分(我使用的是 axios)。
ADDITIONAL DATA

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

我也刚刚收到一份报告,其中包含“用值捕获的非错误承诺拒绝:空”。 与上面提到的@anton-bot 类似,受影响的用户在 Mac OS X 10.15.6 上使用 Safari 13.1.2。

我查看了我编译的应用程序代码的reject(调用,其中可能提供了null对象,但找不到任何对象,所以我想知道它可能是浏览器扩展还是第三个派对脚本。 由于没有堆栈跟踪或面包屑,很难知道到底发生了什么。

过去两周也一直在看到这一点。 在我们的网站上,我们只在使用 google maps javascript API 的页面上看到它,所以我觉得它可能与此有关。 还有其他人在使用谷歌地图的 URL 上看到过这个吗?

编辑:到目前为止,我们已经在 iOS 和 Android 上看到了这个问题

编辑:附加数据:

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

@asbjornh不,我的页面中没有 Google 地图

@kamilogorek OP 的附加数据(和我的)是否是由这样的Promise.reject(new Event("error")) ? 或者这种情况下的 Sentry 事件是否总是具有看起来像浏览器事件的有效载荷?

我也收到同样的错误

这个错误刚刚耗尽了我的配额容量。

在过去的 24 小时内,我们有 289 个此类事件 - 我们的页面甚至还没有上线..

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

我们正在使用 next.js

在这里和 cra 一样😅

似乎这个问题是由大致这样的事情引起的:

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

onerror钩子实际上会收到一个Event对象,而不是Error实例,这会导致上面提到的这些问题。 这可以通过按照https://developer.mozilla.org/de/docs/Web/API/HTMLScriptElement 的建议用Error包装Event来避免:

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);
});

就我而言,是 Next.js 的9.5.2预取机制导致它在 Firefox 上出现,以防万一有人有类似的情况。 (也许在这里?https://github.com/getsentry/sentry-javascript/issues/2546#issuecomment-697771381)这是问题: https : 9.5.3或 Canary 来解决。

但是,浏览器中的错误要详细得多:

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

我们如何让 Sentry 捕获这些数据?

@Turbo87是的! 这正是我们只在使用@googlemaps/js-api-loader页面上看到它的原因。 他们正在做你在这里描述的

谢谢!!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

guischdi picture guischdi  ·  28评论

ffxsam picture ffxsam  ·  24评论

DaddyWarbucks picture DaddyWarbucks  ·  22评论

jan-auer picture jan-auer  ·  24评论

karolisdzeja picture karolisdzeja  ·  36评论