Saya mengalami beberapa kemajuan belajar tentang Janji, tetapi saya tidak mengerti mengapa knex berperilaku seperti ini di node.js.

Saya berhasil menerima kueri dan console.log out, tetapi ketika saya menjalankan

nama file simpul.js

Proses tidak berhenti dan tetap di sana setelah berhasil mencetak, seperti jika Janji masih tertunda. Bukankah seharusnya knex.destroy() dalam pernyataan .finally mengakhiri Janji?

async function SELECT_ALL_P() {
  const transaction = await knex.transaction()
  return knex
  .select('*')
  .from('p')
  .then(items => {
    return console.log(items)
  })
  .catch(error => {
    console.log(error)
  })
  .finally(function() {
    knex.destroy()
  })
}

SELECT_ALL_P()

Saya acara mencoba seperti

.then(items => {
    knex.destroy()
    return console.log(items)
  })

Tapi itu tidak berhasil juga. Saya perlu Ctrl+C di terminal untuk keluar dari eksekusi simpul.

3
jacksonbenete 2 Juli 2020, 20:36

1 menjawab

Jawaban Terbaik

Saat knex.destroy() dipanggil, knex tidak akan mengizinkan kueri/transaksi baru dimulai dan kemudian menunggu semuanya selesai sebelum mematikan semuanya dan menghancurkan kumpulan.

Dalam contoh Anda, Anda tidak pernah melakukan transaction.commit() atau transaction.rollback(err), sehingga koneksi tidak pernah dikembalikan ke kumpulan dan panggilan knex.destroy() tidak pernah selesai (mungkin setelah beberapa waktu habis).

Sebenarnya Anda bahkan tidak pernah membuat pertanyaan apa pun melalui transaksi itu. Jika Anda hanya ingin membuat opsi untuk melakukan transaksi saat diperlukan, Anda dapat membuat transactionProvider, yang kemudian dengan malas membuat transaksi tunggal, saat diminta untuk pertama kalinya.

1
Mikael Lepistö 27 Juli 2020, 12:20