Sentry-javascript: Node.js 12 "Tidak dapat membaca properti 'masuk' dari undefined"

Dibuat pada 28 Mei 2019  ·  42Komentar  ·  Sumber: getsentry/sentry-javascript

Paket + Versi

  • [x] @sentry/node
  • [x] @sentry/integrations

Versi: kapan:

@sentry/node 5.3.0
@sentry/integrations 5.3.1
Node.js 12.3.1

Keterangan

Setelah beralih ke Node 12.3.1 saya mulai mengalami crash keras pada aplikasi saya dengan cara ini:

TypeError: Cannot read property 'enter' of undefined
    at AsyncHook.before (domain.js:76:20)
    at emitHook (internal/async_hooks.js:164:38)

Inilah cara kami menggunakan Sentry (hanya baris yang relevan):

const express = require('express');
const app = express();
const Sentry = require('@sentry/node');
const SentryIntegrations = require('@sentry/integrations');
Sentry.init({
  dsn: process.env.SENTRY_DSN,
  environment: process.env.APP_ENV,
  release: `support@${process.env.HEROKU_RELEASE_VERSION}`,
  integrations: [
    new SentryIntegrations.ExtraErrorData(),
    new SentryIntegrations.Transaction(),
  ],
});
app.use(Sentry.Handlers.requestHandler());
app.use(Sentry.Handlers.errorHandler());
module.exports = app;

Setelah memeriksa kode kami, saya yakin satu-satunya tempat di mana domain Node.js digunakan adalah kode Sentry. Inilah mengapa saya membuka masalah ini.

Perubahan terbaru pada async_handlers yang ditautkan ke domain: https://github.com/nodejs/node/commit/04355eff5bc604cb639f91d159ce21971e2c3bb4#commitcomment -33702918

Beri tahu saya jika Anda membutuhkan yang lain.

Needs Reproduction

Komentar yang paling membantu

fyi @vvo @BYK @kamilogorek @emhagman @kunal15595 - Saya menemukan masalah Anda di sini karena saya memiliki kesalahan yang sama persis muncul di server hapi saya (tanpa penjaga) dengan node > 12.2.2.

Saya percaya itu disebabkan oleh https://github.com/nodejs/node/issues/28275 . Perbaikan untuk masalah itu digabungkan 5 hari yang lalu dengan https://github.com/nodejs/node/commit/43e5478e2f51343b66f4d243bb4800d8e422f764 dan mudah-mudahan akan segera dirilis dan menyelesaikan masalah kami.

Ketika pengecualian yang tidak tertangkap dilemparkan ke dalam domain, domainnya adalah
dihapus dari tumpukan pada 43a5170.
Ini berarti bahwa itu mungkin tidak akan tetap hidup sebagai objek lagi,
dan mungkin sampah dikumpulkan sebelum kait after() dapat berjalan,
yang mencoba untuk keluar juga.

Selesaikan itu dengan membuat referensi ke domain yang kuat saat itu
aktif.

Semua 42 komentar

Diuji dengan Node.js 12.4.0 juga, hasil yang sama, segera setelah saya menambahkan kembali inisialisasi penjaga seperti yang ditunjukkan pada komentar sebelumnya, itu akan macet dengan Cannot read property 'enter' of undefined , ada wawasan @BYK?

Maaf @vvo , tidak ada wawasan saat ini. @HazAT , @kamilogorek ada ide?

Sepertinya kita masih punya waktu beberapa bulan sebelum Node 12 menjadi LTS baru lho.

Node v12.4.0 , tidak dapat mereproduksi dengan kode Anda _(ツ)_/¯

image

Mendapatkan ini di node v12.6.0, penjaga v5.5.0
diperbaiki dengan kembali ke v12.2.0

Saya juga mengalami masalah ini saat memutakhirkan ke NodeJS 12.6.0

@emhagman @kunal15595 apakah Anda juga menggunakan express? Mencoba melihat kesamaan yang kami miliki di sini

fyi @vvo @BYK @kamilogorek @emhagman @kunal15595 - Saya menemukan masalah Anda di sini karena saya memiliki kesalahan yang sama persis muncul di server hapi saya (tanpa penjaga) dengan node > 12.2.2.

Saya percaya itu disebabkan oleh https://github.com/nodejs/node/issues/28275 . Perbaikan untuk masalah itu digabungkan 5 hari yang lalu dengan https://github.com/nodejs/node/commit/43e5478e2f51343b66f4d243bb4800d8e422f764 dan mudah-mudahan akan segera dirilis dan menyelesaikan masalah kami.

Ketika pengecualian yang tidak tertangkap dilemparkan ke dalam domain, domainnya adalah
dihapus dari tumpukan pada 43a5170.
Ini berarti bahwa itu mungkin tidak akan tetap hidup sebagai objek lagi,
dan mungkin sampah dikumpulkan sebelum kait after() dapat berjalan,
yang mencoba untuk keluar juga.

Selesaikan itu dengan membuat referensi ke domain yang kuat saat itu
aktif.

Terima kasih @spanditcaa!

Terima kasih @spanditcaa !

Bagi siapa pun yang penasaran, ini mendarat di 12.8.0:
https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#2019 -08-06-version-1280-current-bridgear

https://github.com/nodejs/node/commit/727ffe4720

Baru saja mengalami masalah yang sama pada 12.10 yang keluar pada 3 September. Tidak yakin ini sudah diperbaiki.

@emhagman Ya sama untuk saya, 12.10 juga

dipicu untuk saya juga, versi 12.10

Saya akan mencoba dan menusuk ini dan menyerahkan PR karena tim Penjaga telah memutuskan bahwa itu belum layak untuk dilihat. Saya akan melaporkan kembali!

Mungkinkah beberapa perubahan telah dilakukan pada modul domain di NodeJS > 12.2.0 yang menyebabkan ini? (yang menurut saya merupakan keputusan yang aneh karena sudah usang sehingga seharusnya "jangan sentuh", kurang lebih?)

Saya bertanya karena kami memiliki crash yang hampir identik di aplikasi yang tidak terkait yang bekerja dengan baik di bawah Node <12 dan Node 12 <12.3.0. Kami menggunakan "domain" di sana sebagai semacam konteks sekitar.

TypeError: Tidak dapat membaca properti 'masuk' dari undefined
di AsyncHook.before (domain.js:79:20)
di emitHook (internal/async_hooks.js:164:38)
npm ERR! kode ELIFECYCLE

juga terpengaruh oleh ini... ada solusi yang berhasil?

karena tim Penjaga telah memutuskan itu belum layak untuk dilihat

Kesalahan dilemparkan secara internal dalam implementasi domain . Saya tidak punya kekuatan super untuk mengubahnya. requestHandler tidak dapat bekerja tanpa domain tanpa pengerjaan ulang lengkap untuk async hook, yang masih dalam tahap percobaan, yang membuatnya lebih buruk.

@kamilogorek Maaf, saya tidak mencoba menyerang tim. Saya lebih merujuk bahwa 12 belum ada di LTS sehingga sepertinya bukan prioritas. Orang lain mengklaim bahwa mereka tidak memiliki masalah ini dengan versi NodeJS yang sama dengan yang kami hadapi, jadi sepertinya ada sesuatu yang spesifik tentang bagaimana beberapa orang menggunakannya, menyiratkan ada perbaikan

@emhagman Jangan khawatir. Jika ada cara Anda dapat mereproduksinya dan menyediakan basis kode, saya akan dengan senang hati membantu men-debug ini. Kami membutuhkan repro yang solid terlebih dahulu, karena saya sendiri tidak dapat memecahkannya dengan cara apa pun.

fyi @kamilogorek masalah muncul kembali untuk kami juga. Kami condong ke arah memindahkan basis kode kami dari domain (yang sudah tidak digunakan lagi) vs. mengeluarkan upaya pemecahan masalah lebih lanjut.

Semoga berhasil.

@kamilogorek @spanditcaa Benar jika saya salah, tetapi masalahnya bukan apakah kita menggunakan domain dalam basis kode kita atau tidak, tetapi Sentry menggunakannya dalam file handlers.js untuk menambahkan req dan objek res sebagai konteks sepanjang permintaan sehingga jika terjadi kesalahan, itu dapat mengirim konteks ke layanan Sentry untuk kesalahan kami. Satu-satunya modul yang kami gunakan yang menggunakan domain adalah pg-native , libpq , dan @sentry/node

Jika demikian, menghapus domain dari basis kode Anda tetap tidak akan memperbaiki masalah ini di NodeJS >= 12.4 jika Anda menggunakan @sentry/node

EDIT: Membaca ulang komentar Anda, Anda pasti tahu itu masalahnya. Maaf!

Apakah ada pernyataan resmi tentang bagaimana kita harus melanjutkan masalah ini? node 12 akan menjadi LTS dalam beberapa hari...

NodeJS 12.13.0 sekarang menjadi LTS. Adakah yang sudah mencobanya atau 13.0.0 yang baru untuk melihat apakah ini telah diperbaiki di inti?

Sayangnya itu masih terjadi dengan versi lts, ​​saya harus menghapus pegangan kesalahan penjaga ekspres untuk saat ini ...

Saya kira solusi sementara adalah menggunakan cls-hooked dan menulis middleware Anda sendiri untuk menangkap kesalahan dan meneruskannya ke Sentry. Kami sudah menggunakannya untuk konteks log kami dan saya yakin middleware Sentry tidak melakukan sesuatu yang terlalu gila untuk memperkaya data.

Biasanya saya tidak akan peduli tetapi seharusnya ada peningkatan kecepatan startup yang besar dan pengaturan memori default untuk V8 berdasarkan lingkungan di versi 12.x yang lebih baru yang sangat ingin kami manfaatkan.

Bisakah Anda mengonfirmasi bahwa itu tidak terjadi saat menonaktifkan middleware kesalahan express ?

@emhagman ya, saya dapat mengonfirmasi bahwa ini hanya terjadi dengan middleware ekspres, kami masih menggunakan Sentry.captureException dan captureMessage dengan cakupan.. tidak ada masalah. Kami memiliki penangan kesalahan kami sendiri sekarang, tetapi perlu diketahui bahwa remah roti dan rekan tidak berfungsi sebagaimana mestinya dengan "solusi" ini.

@simllll Terima kasih atas infonya. Breadcrumb tidak bekerja untuk kami saat ini karena kami menggunakan pino sebagai logger kami jadi itu bukan masalah besar. Kedengarannya seperti ini mungkin solusi untuk saat ini

Saya telah memposting laporan bug di repo NodeJS. Mudah-mudahan, seseorang memiliki wawasan tentang mengapa itu bisa terjadi https://github.com/nodejs/node/issues/30122

Kami tidak menggunakan Sentry secara eksplisit dalam proyek kami dan kami mengalami masalah ini di server produksi kami yang berjalan di wadah Docker:

  1. simpul: alpine - v13.0.1
  2. npm - v6.12.0

Sistem Informasi:
Linux4.14.137+ SMP Kam 8 Agustus 02:47:02 PDT 2019 x86_64 Linux

Sayangnya saya tidak bisa mendapatkan log debug karena wadah telah dihapus ketika macet.

@saniagh Lihat utas di sisi node . Ini ada hubungannya dengan menggunakan https.Agent saat menggunakan kembali soket yang sama. nodejs/node#30122

Periksa untuk melihat apakah Anda menelepon https.Agent mana saja atau perpustakaan Anda berada.

@simllll @kamilogorek Masalah telah ditemukan dan ada PR terbuka! Terima kasih kepada @addaleax telah meluangkan waktu untuk mereproduksi dan memperbaikinya.

@saniagh Bug ini dapat terjadi dengan agen http atau https jadi saya yakin ini masih berlaku untuk Anda.

https://github.com/nodejs/node/issues/30122#issuecomment -548422939

Untuk semua orang di sini, perbaikan telah mendarat di sini https://github.com/nodejs/node/commit/d26a74dca0d04a827140a33a43c38a55f12c7296

Itu harus segera dirilis ke 13.x dan kemudian dua minggu kemudian ke 12.x jadi awasi terus

@emhagman @addaleax terima kasih! :)

Adakah yang punya solusi sampai perbaikannya masuk?

@scragg0x Sayangnya, hal terbaik yang dapat Anda lakukan adalah tetap menggunakan 12.2.x hingga versi berikutnya dirilis dalam satu atau dua minggu.

Bagi Anda yang menggunakan 13.x, perbaikannya telah menjadi 13.2.0

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V13.md#2019 -11-21-version-1320-current-mylesborins
https://github.com/nodejs/node/commit/e59cc8aad8

Bagi Anda yang menggunakan 12.x, kami harus menunggu sekitar 2 minggu lagi untuk masuk ke LTS

ada yang tahu kalau itu mendarat di 12.14?

Dijadwalkan untuk hari ini: https://github.com/nodejs/node/pull/31069

Sudah keluar! https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V12.md#12.14.1
Khususnya --

[652514233f] - http,async_hooks: keep resource object alive from socket (Anna Henningsen) #30196

Iya! Menutupnya kemudian.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jaylinski picture jaylinski  ·  3Komentar

franciscovelez picture franciscovelez  ·  3Komentar

grigored picture grigored  ·  3Komentar

Nickforall picture Nickforall  ·  3Komentar

THPubs picture THPubs  ·  3Komentar