Dalam kod yang anda berikan, janji itu tidak menjeda pelaksanaan kod untuk menunggu fungsi findUser selesai. Ini kerana fungsi findUser tidak mengembalikan janji. Sebaliknya, ia kembali tidak ditentukan serta-merta, menyebabkan kod diteruskan tanpa menunggu pertanyaan pangkalan data selesai.
Untuk membetulkannya, fungsi findUser harus mengembalikan janji yang diselesaikan dengan baris yang diambil daripada pangkalan data:
me.findUser = function(params, res) { var username = params.username; return new Promise(function (res, rej) { pool.getConnection(function (err, connection) { if (err) { rej('db error'); } else { connection.query('SELECT Id, Name, Password FROM Users WHERE Users.Name = ?', [username], function (err, rows) { connection.release(); if (!err) { res(rows); } else { rej('other error'); } }); } }); }); }
Dengan perubahan ini, janji akan menjeda pelaksanaan kod dan tunggu pertanyaan selesai sebelum meneruskan dengan pernyataan if/else.
Pengendali ralat pengendali ralat kedua dikeluarkan kerana fungsi findUser menolak janji dengan ralat mesej. Ini menyebabkan pengendali ketika itu dilangkau dan pengendali tangkapan (dengan mesej 'pengendali ralat kedua') dipanggil sebaliknya.
Untuk menyelesaikan masalah ini, pastikan fungsi findUser mengendalikan ralat dan menyelesaikan dengan yang diingini data dengan betul. Selain itu, anda boleh menambah pengendalian ralat ke peringkat seterusnya rantai janji untuk mengendalikan sebarang ralat seterusnya.
Atas ialah kandungan terperinci Mengapa Janji Saya dalam Node.js Express Tidak Menunggu Pertanyaan Pangkalan Data Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!