Menangkap simpul kesalahan mysql js

Saya telah menggunakan node mysql baru-baru ini. Saya menemukan masalah yang (jika saya mengerti dengan benar) yang telah disinggung Dave sebelumnya (https. //grup. google. com/d/msg/node-red/JtzNMLN2NpA/vU9SkvK3HwAJ). Dalam database saya, saya telah menetapkan kolom untuk memiliki nilai unik. Akibatnya, upaya untuk memasukkan nilai duplikat ke dalam tabel ditolak oleh database. Masalahnya adalah tidak ada kesalahan yang terjadi di sini - dalam kode, itu jelas sebuah simpul. memperingatkan yang digunakan. Karena itu, saya tidak dapat menangkap kesalahan dan menanggapinya.  

Bagi saya, aliran saya masuk akal; .  

Oke, jadi bagian kedua dari ini adalah meskipun saya masuk dan mengedit node mysql (ln 106) ke node. kesalahan alih-alih simpul. peringatkan, saya masih belum Menangkap apa pun di Catch-node saya. Debug menunjukkan bahwa saya telah berhasil mengubah node. memperingatkan ke node. kesalahan, meskipun. Apa yang saya lewatkan, saya bertanya-tanya?

Ini adalah tutorial 8º dari rangkaian lengkap membangun produksi "NodeJS API menggunakan Express, MySQL, dan Sequelize"

Kode sumber lengkap kelas ini tersedia di GitHub Martial Arts API Bagian 8

Foto oleh Sarah Kilian di UnsplashHANDLING ERROR

Setelah semua operasi CRUD dari tutorial sebelumnya, kita mungkin memiliki cara untuk menampilkan pesan kesalahan yang berarti kepada pengguna jika sesuatu yang buruk terjadi. Pesan ini juga akan berguna bagi Anda sebagai seorang programmer

Kami melakukan permintaan kami di dalam blok try/catch, oleh karena itu kami akan menangani kesalahan di catch

Ini adalah contoh untuk metode getAll() kami

Kami pertama kali menampilkan kesalahan di konsol, sehingga Anda sebagai programmer juga dapat memahami apa yang salah. Dan setelah semua kami menampilkan kesalahan ini dalam respons sebagai kesalahan server internal 500 (sesuatu yang buruk terjadi dalam permintaan server)

SEMUA PERMINTAAN

Saya akan menempelkan intinya di sini dengan semua kesalahan penanganan operasi CRUD

Anda akan melihat bahwa dalam metode getAll()_ saya mengubah nama tabel dari martial_arts menjadi martial_art. Ini akan menghasilkan kesalahan karena Sequelize tidak akan menemukan tabel dengan nama yang salah ini

PENGUJIAN

Mari kita uji kesalahan kita

Menampilkan permintaan GET mengembalikan kesalahan "Database tidak dikenal 'martial_art'" KESIMPULAN

Dengan semua itu, bayangkan. Anda sudah dapat melakukan semua operasi CRUD di database Anda melalui kesalahan penanganan API Anda

Ini adalah simpul. driver js untuk mysql. Itu ditulis dalam JavaScript, tidak memerlukan kompilasi. Ini menyediakan hampir semua koneksi/permintaan dari MySQL. Node-mysql mungkin adalah salah satu modul terbaik yang digunakan untuk bekerja dengan database MySQL dan modul tersebut dipelihara secara aktif

Kami berasumsi bahwa Anda telah menginstal MySQL dan node. js di lingkungan Windows atau Linux

Berikut adalah contoh untuk mengambil baris pertama dari tabel 'karyawan' milik database ''

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'datasoft123',
  database : 'hr'
});
connection.connect();

connection.query('SELECT * FROM employees', function(err, rows, fields) 
{
  if (err) throw err;

  console.log(rows[0]);
});

connection.end();

Keluaran

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_

Dari contoh di atas Anda dapat mempelajari cara membuat sambungan baru dan menutup sambungan

Isi

Instal node MySQL. driver js

$ npm install mysql

Anda dapat menginstal versi terbaru dari Github untuk memeriksa apakah perbaikan bug berfungsi. Dalam hal ini gunakan perintah berikut

$ npm install felixge/node-mysql

Buat koneksi

Berikut adalah kode untuk membuat koneksi

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_

Berikut adalah metode lain untuk membuat koneksi dengan menjalankan kueri

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'datasoft123'
});

connection.query('SELECT 1', function(err, rows) {

if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }
console.log('connected!');
});

Opsi Koneksi

NameDescriptionhostNama host dari database. Standarnya adalah localhost. portNomor port yang akan dihubungkan. Standarnya adalah 3306. localAddressAlamat IP sumber yang akan digunakan untuk koneksi TCP. (Opsional)socketPathJalur ke soket domain unix yang akan dihubungkan. Saat digunakan host dan port diabaikan. userPengguna MySQL untuk mengotentikasi sebagai. kata sandi Kata sandi pengguna MySQL itu. databaseName dari database yang akan digunakan untuk koneksi ini (Opsional). charsetCharset untuk koneksi. Ini disebut "pemeriksaan" di tingkat SQL MySQL (seperti utf8_general_ci). Jika charset level SQL ditentukan (seperti utf8mb4) maka susunan default untuk charset itu digunakan. (Bawaan. 'UTF8_GENERAL_CI')timezoneZona waktu yang digunakan untuk menyimpan tanggal lokal. Default adalah. 'lokal'. connectTimeoutMilidetik sebelum batas waktu terjadi selama koneksi awal ke server MySQL. (Bawaan. 10 detik)stringifyObjectsStringify objek alih-alih mengonversi ke nilai. Lihat edisi #501. (Bawaan. 'false')insecureAuthAllow terhubung ke instance MySQL yang meminta metode autentikasi lama (tidak aman). (Bawaan. false)typeCastMenentukan apakah nilai kolom harus dikonversi ke tipe JavaScript asli. (Bawaan. true)queryFormatFungsi format kueri kustom. Lihat Format khusus. supportBigNumbersKetika berhadapan dengan angka besar (BIGINT dan kolom DECIMAL) dalam database, Anda harus mengaktifkan opsi ini (Default. Salah). bigNumberStringsMengaktifkan supportBigNumbers dan bigNumberStrings memaksa angka besar (kolom BIGINT dan DECIMAL) untuk selalu dikembalikan sebagai objek JavaScript String (Default. Salah)
Mengaktifkan supportBigNumbers tetapi membiarkan bigNumberStrings dinonaktifkan akan mengembalikan angka besar sebagai objek String hanya jika tidak dapat direpresentasikan secara akurat dengan objek JavaScript Number (yang terjadi jika melebihi rentang [-2^53, +2^53]), jika tidak maka akan dikembalikan . Opsi ini diabaikan jika supportBigNumbers dinonaktifkan. tipe tanggal dateStringsForce (TIMESTAMP, DATETIME, DATE) untuk dikembalikan sebagai string daripada digelembungkan menjadi objek Tanggal JavaScript. (Bawaan. false)debugMencetak detail protokol ke stdout. (Bawaan. false)traceMenghasilkan pelacakan tumpukan pada Kesalahan untuk menyertakan situs panggilan pintu masuk perpustakaan ("pelacakan tumpukan panjang"). Sedikit penalti kinerja untuk sebagian besar panggilan. Default benar. multipleStatementsIzinkan beberapa pernyataan mysql per kueri. Hati-hati dengan ini, ini membuat Anda terkena serangan injeksi SQL. (Bawaan. false)flagsDaftar flag koneksi untuk digunakan selain yang default. Dimungkinkan juga untuk membuat daftar hitam yang default. Untuk informasi selengkapnya, periksa Bendera Koneksi. sslobject dengan parameter ssl atau string yang berisi nama profil ssl. Lihat opsi SSL

Catatan. Nilai kueri pertama kali dicoba untuk diuraikan sebagai JSON, dan jika gagal dianggap sebagai string teks biasa

Mengakhiri koneksi

Ada dua cara untuk mengakhiri koneksi

  • akhir() metode
  • menghancurkan() metode

Anda dapat mengakhiri koneksi dengan memanggil metode end()


connection.end(function(err) {
  // The connection is terminated now
});
_

Ini akan memastikan semua permintaan enqueued sebelumnya masih sebelum mengirim paket COM_QUIT ke server MySQL. Jika kesalahan fatal terjadi sebelum paket COM_QUIT dapat dikirim, argumen err akan diberikan ke panggilan balik, tetapi koneksi akan diakhiri terlepas dari itu

menghancurkan() metode

Metode ini segera mengakhiri koneksi. Selain itu, destroy() menjamin bahwa tidak ada lagi peristiwa atau panggilan balik yang akan dipicu untuk koneksi tersebut

connection.destroy();

Tidak seperti end() metode destroy() tidak menerima argumen callback

Mengalihkan pengguna / mengubah status koneksi

MySQL menawarkan perintah changeUser yang memungkinkan Anda untuk mengubah pengguna saat ini dan aspek koneksi lainnya tanpa mematikan soket yang mendasarinya


connection.changeUser({user : 'user2'}, function(err) {
  if (err) throw err;
});
_

Pilihan yang tersedia

NameDescriptionuserNama pengguna baru (default ke yang sebelumnya). kata sandiKata sandi pengguna baru (default ke yang sebelumnya). charsetCharset baru (default dari yang sebelumnya). database Database baru (default ke yang sebelumnya)

Efek samping yang terkadang berguna dari fungsi ini adalah bahwa fungsi ini juga menyetel ulang status koneksi apa pun (variabel, transaksi, dll. )

Kesalahan yang ditemui selama operasi ini dianggap sebagai kesalahan koneksi yang fatal oleh modul ini

Penanganan kesalahan

Ada beberapa opsi untuk menangani kesalahan dalam modul ini

Semua kesalahan yang dibuat oleh modul ini adalah turunan dari objek Kesalahan JavaScript. Selain itu mereka datang dengan dua properti

  • berbuat salah. kode
    • Kesalahan server MySQL (mis. g. 'ER_ACCESS_DENIED_ERROR')
    • Sebuah simpul. kesalahan js (mis. g. 'ECONNREFUSED')
    • Kesalahan internal (mis. g. 'PROTOCOL_CONNECTION_LOST')
  • berbuat salah. fatal. Boolean, menunjukkan jika kesalahan ini terminal ke objek koneksi

Kesalahan fatal disebarkan (menyebabkan dikalikan dengan proses apa pun) ke semua panggilan balik yang tertunda. Pada contoh di bawah ini, kesalahan fatal dipicu dengan mencoba nama pengguna yang tidak valid. Oleh karena itu, dalam contoh berikut, objek error disebarkan ke kedua callback yang tertunda

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'roott',
  password : 'datasoft123',
});
connection.connect(function(err) {
  console.log(err.code);  
  console.log(err.fatal);  
});

connection.query('SELECT 1', function(err) {
  console.log(err.code);  
  console.log(err.fatal);  
});
_

Keluaran

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_0

Dalam contoh ini, kesalahan fatal dipicu oleh pengguna yang tidak valid

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_1

Keluaran

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_2

Kesalahan normal hanya didelegasikan ke callback tempatnya. Dalam contoh berikut, hanya panggilan balik pertama yang menerima kesalahan (nama db salah), kueri kedua berfungsi seperti yang diharapkan

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_3Server terputus

Anda mungkin kehilangan koneksi ke server MySQL karena masalah jaringan, server kehabisan waktu, server sedang dimulai ulang, atau mogok. Semua kejadian ini dianggap sebagai kesalahan fatal, dan akan memiliki kesalahan. kode = 'PROTOCOL_CONNECTION_LOST'. Lihat bagian Penanganan Kesalahan untuk informasi lebih lanjut

Menghubungkan kembali koneksi dilakukan dengan membuat koneksi baru. Setelah diakhiri, objek koneksi yang ada tidak dapat dihubungkan kembali dengan desain

Dengan Pool, koneksi yang terputus akan dihapus dari pool membebaskan ruang untuk membuat koneksi baru pada panggilan getConnection berikutnya

Opsi SSL

Opsi ssl dalam opsi koneksi mengambil string atau objek. Saat diberi string, ia menggunakan salah satu profil SSL standar yang disertakan. Profil berikut disertakan

  • "Amazon RDS". profil ini untuk menghubungkan ke server Amazon RDS dan berisi ca dari https. // rds. amazonaw. com/doc/rds-ssl-ca-cert. pem

Saat terhubung ke server lain, Anda perlu menyediakan objek opsi, dalam format yang sama dengan crypto. createCredentials. Harap perhatikan argumen mengharapkan string sertifikat, bukan nama file ke sertifikat. Ini adalah contoh sederhana

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_4

Anda juga dapat terhubung ke server MySQL tanpa menyediakan CA yang sesuai untuk dipercaya. Anda seharusnya tidak melakukan ini

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
5
{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
5

Menggabungkan koneksi

Kumpulan koneksi adalah cache dari koneksi database yang dipertahankan sehingga koneksi dapat digunakan kembali saat permintaan ke database di masa mendatang diperlukan. Kumpulan koneksi digunakan untuk meningkatkan kinerja mengeksekusi perintah pada database

Gunakan kolam secara langsung

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_7

Ketika Anda selesai dengan koneksi, panggil saja koneksi. release() dan koneksi akan kembali ke pool, siap digunakan lagi oleh orang lain

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_8

Jika Anda ingin menutup koneksi dan menghapusnya dari pool, gunakan connection. menghancurkan() sebagai gantinya. Pool akan membuat koneksi baru saat dibutuhkan lagi

Menutup semua koneksi di kolam

Ketika Anda selesai menggunakan kumpulan, Anda harus mengakhiri semua koneksi atau Node. js event loop akan tetap aktif sampai koneksi ditutup oleh server MySQL. Metode akhir mengambil panggilan balik opsional yang dapat Anda gunakan untuk mengetahui setelah semua koneksi berakhir. Koneksi berakhir dengan anggun, sehingga semua kueri yang tertunda akan tetap selesai dan waktu untuk mengakhiri kumpulan akan bervariasi. Sekali renang. end() telah dipanggil, pool. getConnection dan operasi lainnya tidak lagi dapat dilakukan

Opsi kolam

Pool mendukung semua opsi koneksi normal. Selain itu, berikut adalah beberapa opsi tambahan

NameDescriptionacquireTimeoutMilidetik sebelum batas waktu terjadi selama akuisisi koneksi. Ini sedikit berbeda dari connectTimeout, karena memperoleh koneksi kumpulan tidak selalu melibatkan pembuatan koneksi. (Bawaan. 10 detik)waitForConnectionsMenentukan tindakan kumpulan saat tidak ada koneksi yang tersedia dan batas telah tercapai. Jika benar, kumpulan akan mengantri permintaan koneksi dan memanggilnya saat tersedia. Jika salah, kumpulan akan segera menelepon kembali dengan kesalahan. (Bawaan. true)connectionLimitJumlah maksimum koneksi yang akan dibuat sekaligus. (Bawaan. 10)queueLimitJumlah maksimum koneksi meminta kumpulan akan mengantri sebelum mengembalikan kesalahan dari getConnection. Jika diatur ke 0, tidak ada batasan jumlah permintaan koneksi yang antri. (Bawaan. 0)

Acara renang

koneksi

Kumpulan akan memancarkan acara koneksi saat koneksi baru dibuat di dalam kumpulan. Jika Anda perlu menyetel variabel sesi pada koneksi sebelum digunakan, Anda dapat mendengarkan peristiwa koneksi

{ EMPLOYEE_ID: 100,
  FIRST_NAME: 'Steven',
  LAST_NAME: 'King',
  EMAIL: '[email protected]',
  PHONE_NUMBER: '515.123.4567',
  HIRE_DATE: Wed Jun 17 1987 00:00:00 GMT+0530 (India Standard Time),
  JOB_ID: 'AD_PRES',
  SALARY: 24000,
  COMMISSION_PCT: 0,
  MANAGER_ID: 0,
  DEPARTMENT_ID: 90 }
_9

enqueue

Kumpulan akan memunculkan peristiwa enqueue saat callback telah diantrekan untuk menunggu koneksi yang tersedia

$ npm install mysql
0

Melarikan diri dari nilai kueri

Injeksi SQL adalah teknik (seperti mekanisme serangan web lainnya) untuk menyerang aplikasi berbasis data. Serangan ini dapat melewati firewall dan dapat memengaruhi sistem yang telah ditambal sepenuhnya. Penyerang mengambil keuntungan dari karakter yang difilter dengan buruk atau tidak lolos dengan benar yang disematkan dalam pernyataan SQL ke dalam mem-parsing data variabel dari input pengguna. Penyerang menyuntikkan data sewenang-wenang, paling sering kueri basis data, ke dalam string yang akhirnya dieksekusi oleh basis data melalui aplikasi web (mis. g. formulir masuk)

Untuk menghindari serangan SQL Injection, Anda harus selalu menghindari data yang disediakan pengguna sebelum menggunakannya di dalam kueri SQL. Anda dapat melakukannya menggunakan koneksi. escape() atau kumpulan. melarikan diri() metode

$ npm install mysql
1

Sebagai alternatif, Anda dapat menggunakan ?

$ npm install mysql
2

Jenis nilai yang berbeda diloloskan secara berbeda, berikut caranya

  • Angka dibiarkan tak tersentuh
  • Boolean dikonversi menjadi string benar / salah
  • Objek tanggal dikonversi menjadi 'YYYY-mm-dd HH. ii. string ss
  • Buffer dikonversi menjadi string hex, mis. g. X'0fa5'
  • String lolos dengan aman
  • Array diubah menjadi daftar, mis. g. ['a', 'b'] berubah menjadi 'a', 'b'
  • Array bersarang diubah menjadi daftar yang dikelompokkan (untuk sisipan massal), mis. g. [['a', 'b'], ['c', 'd']] berubah menjadi ('a', 'b'), ('c', 'd')
  • Objek diubah menjadi pasangan kunci = 'nilai'. Objek bersarang dilemparkan ke string
  • undefined / null dikonversi menjadi NULL
  • NaN / Infinity dibiarkan apa adanya. MySQL tidak mendukung ini, dan mencoba memasukkannya sebagai nilai akan memicu kesalahan MySQL sampai mereka mengimplementasikan dukungan

Berikut adalah contoh pernyataan INSERT INTO

$ npm install mysql
_3

Anda juga dapat menggunakan fungsi pelolosan secara langsung, lihat contoh berikut

$ npm install mysql
_4

Melarikan diri dari pengidentifikasi kueri

Karena pengidentifikasi SQL (nama basis data / tabel / kolom) disediakan oleh pengguna, Anda harus menghindarinya dengan mysql. escapeId(pengidentifikasi), koneksi. escapeId(pengidentifikasi) atau kumpulan. escapeId(pengidentifikasi) seperti ini

$ npm install mysql
5

Ini juga mendukung penambahan pengidentifikasi yang memenuhi syarat. Itu akan lolos dari kedua bagian

$ npm install mysql
6

Atau, Anda dapat menggunakan ??

$ npm install mysql
7

Catatan. Urutan karakter terakhir bersifat eksperimental dan sintaks mungkin berubah

Saat Anda melewatkan Objek ke. melarikan diri() atau. pertanyaan(),. escapeId() digunakan untuk menghindari injeksi SQL pada kunci objek

Mempersiapkan Pertanyaan

MySQL5. 6 memberikan dukungan untuk pernyataan yang disiapkan sisi server. Dukungan ini memanfaatkan protokol biner klien/server efisien yang tersedia sejak MySQL 4. 1. Anda dapat menggunakan mysql. format untuk menyiapkan kueri dengan beberapa titik penyisipan, memanfaatkan pelolosan yang tepat untuk id dan nilai. Contoh sederhana berikut ini

$ npm install mysql
_8

Setelah ini, Anda kemudian memiliki kueri lolos yang valid yang kemudian dapat Anda kirim ke database dengan aman. Ini berguna jika Anda ingin menyiapkan kueri sebelum benar-benar mengirimkannya ke database. Sebagai mysql. format diekspos dari SqlString. format Anda juga memiliki opsi (tetapi tidak wajib) untuk meneruskan stringifyObject dan zona waktu, memungkinkan Anda menyediakan cara khusus untuk mengubah objek menjadi string, serta Tanggal yang spesifik lokasi/sadar zona waktu

Format khusus

Jika Anda lebih suka memiliki jenis format pelolosan kueri lain, ada opsi konfigurasi koneksi yang dapat Anda gunakan untuk menentukan fungsi format kustom. Anda dapat mengakses objek koneksi jika Anda ingin menggunakan built-in. escape() atau fungsi koneksi lainnya

Berikut adalah contoh cara mengimplementasikan format lain

$ npm install mysql
9Mendapatkan id dari baris yang disisipkan

Jika Anda memasukkan baris ke dalam tabel dengan kunci primer kenaikan otomatis, Anda dapat mengambil id penyisipan seperti ini

$ npm install felixge/node-mysql
0

Saat berhadapan dengan angka besar (di atas batas presisi Angka JavaScript), Anda harus mempertimbangkan untuk mengaktifkan opsi dukungan Angka Besar untuk dapat membaca id sisipan sebagai string, jika tidak maka akan membuang

Opsi ini juga diperlukan saat mengambil angka besar dari database, jika tidak, Anda akan mendapatkan nilai yang dibulatkan menjadi ratusan atau ribuan karena batas presisi

Mendapatkan jumlah baris yang terpengaruh

Anda bisa mendapatkan jumlah baris yang terpengaruh dari pernyataan sisipkan, perbarui, atau hapus

"changedRows" berbeda dari "affectedRows" karena tidak menghitung baris yang diperbarui yang nilainya tidak diubah

$ npm install felixge/node-mysql
1Mendapatkan ID koneksi

Anda bisa mendapatkan ID koneksi MySQL ("thread ID") dari koneksi yang diberikan menggunakan properti threadId

$ npm install felixge/node-mysql
2Melaksanakan kueri secara paralel

Protokol MySQL bersifat berurutan, ini berarti Anda memerlukan banyak koneksi untuk mengeksekusi kueri secara paralel. Anda dapat menggunakan Pool untuk mengelola koneksi, satu pendekatan sederhana adalah membuat satu koneksi per permintaan http yang masuk

Streaming baris kueri

Terkadang Anda mungkin ingin memilih baris dalam jumlah besar dan memproses setiap baris saat diterima. Ini bisa dilakukan seperti ini

$ npm install felixge/node-mysql
_3

Harap perhatikan beberapa hal tentang contoh di atas

  • Biasanya Anda ingin menerima sejumlah baris tertentu sebelum mulai membatasi koneksi menggunakan pause(). Jumlah ini akan bergantung pada jumlah dan ukuran baris Anda
  • pause() / resume() beroperasi pada soket dan parser yang mendasarinya. Anda dijamin tidak ada lagi peristiwa 'hasil' yang akan diaktifkan setelah memanggil pause()
  • Anda TIDAK HARUS memberikan panggilan balik ke metode query() saat mengalirkan baris
  • Acara 'hasil' akan diaktifkan untuk kedua baris serta paket OK yang mengonfirmasi keberhasilan kueri INSERT/UPDATE

Selain itu, Anda mungkin tertarik untuk mengetahui bahwa saat ini tidak mungkin untuk mengalirkan kolom baris individual, mereka akan selalu disangga seluruhnya. Jika Anda memiliki kasus penggunaan yang baik untuk streaming bidang besar ke dan dari MySQL, saya ingin mendapatkan pemikiran dan kontribusi Anda tentang hal ini

Beberapa pertanyaan pernyataan

Dukungan untuk banyak pernyataan dinonaktifkan karena alasan keamanan (ini memungkinkan serangan injeksi SQL jika nilai tidak di-escape dengan benar). Untuk menggunakan fitur ini, Anda harus mengaktifkannya untuk koneksi Anda

$ npm install felixge/node-mysql
_4

Setelah diaktifkan, Anda dapat menjalankan beberapa kueri pernyataan seperti kueri lainnya

$ npm install felixge/node-mysql
5

Selain itu, Anda juga dapat mengalirkan hasil dari beberapa kueri pernyataan

$ npm install felixge/node-mysql
6

Jika salah satu pernyataan dalam kueri Anda menyebabkan kesalahan, objek Error yang dihasilkan berisi kesalahan. properti indeks yang memberi tahu Anda pernyataan mana yang menyebabkannya. MySQL juga akan berhenti menjalankan pernyataan yang tersisa saat terjadi kesalahan

Harap perhatikan bahwa antarmuka untuk streaming beberapa kueri pernyataan bersifat eksperimental dan saya menantikan umpan baliknya

Prosedur tersimpan

Anda dapat memanggil prosedur tersimpan dari kueri Anda seperti driver mysql lainnya. Berikut adalah kode prosedur asli

$ npm install felixge/node-mysql
_7

Keluaran saat dieksekusi di MySQL

$ npm install felixge/node-mysql
8

Sekarang panggil prosedur tersimpan dari node. js

$ npm install felixge/node-mysql
_9

Keluaran

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_0

Bergabung

Anda dapat memanggil GABUNG dari kueri Anda seperti pada driver mysql lainnya. Ini sebuah contoh

Tulis kueri untuk menampilkan ID departemen, nama departemen, dan nama depan manajer. Lihat '' basis data

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_1

Keluaran

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_2

Transaksi

MySQL (di sini kami mempertahankan versi 5. 6) mendukung transaksi lokal (dalam sesi klien tertentu) melalui pernyataan seperti SET autocommit, START TRANSACTION, COMMIT, dan ROLLBACK. Berikut adalah sintaks dari START TRANSACTION, COMMIT, dan ROLLBACK

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_3

Di simpul. Dukungan transaksi sederhana js tersedia di tingkat koneksi

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'example.org',
  user     : 'root',
  password : 'datasoft123'
});

connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }

 console.log('connected as id ' + connection.threadId);
});
_4

Harap dicatat bahwa beginTransaction(), commit() dan rollback() hanyalah fungsi praktis yang mengeksekusi perintah START TRANSACTION, COMMIT, dan ROLLBACK secara berurutan. Penting untuk dipahami bahwa banyak perintah di MySQL dapat menyebabkan komit implisit, seperti yang dijelaskan dalam dokumentasi MySQL

Timeout

Setiap operasi mengambil opsi batas waktu tidak aktif opsional. Ini memungkinkan Anda menentukan batas waktu yang sesuai untuk operasi. Penting untuk dicatat bahwa batas waktu ini bukan bagian dari protokol MySQL, melainkan operasi batas waktu melalui klien. Ini berarti bahwa ketika batas waktu tercapai, koneksi yang terjadi akan dimusnahkan dan tidak ada operasi lebih lanjut yang dapat dilakukan

Bagaimana cara menangkap kesalahan SQL di node js?

pada('akhir', fungsi(baris) { klien. end(); . json(hasil); . log(err);

Bagaimana node menangani kesalahan MySQL?

query(sql, function(err, results) { if (err) { console. log(err); . kirim({ sukses. palsu, pesan. 'kesalahan permintaan', kesalahan. salah }); . melepaskan();

Bagaimana saya melihat pesan kesalahan MySQL?

Pernyataan SHOW COUNT(*) ERRORS menampilkan jumlah kesalahan. Anda juga dapat mengambil nomor ini dari variabel error_count. TAMPILKAN COUNT(*) KESALAHAN; .

Bagaimana cara saya memeriksa kesalahan di node JS?

Bagaimana Anda Menangani Kesalahan di Node. .
Gunakan Kesalahan Kustom untuk Menangani Kesalahan Operasional. .
Gunakan Middleware. .
Restart Aplikasi Anda dengan Anggun untuk Menangani Kesalahan Programmer. .
Tangkap Semua Pengecualian yang Tidak Tertangkap. .
Tangkap Semua Penolakan Janji yang Tidak Tertangani. .
Gunakan Lokasi Terpusat untuk Log dan Peringatan Kesalahan