cari
Rumahhujung hadapan webtutorial jsKaedah biasa untuk mengendalikan MySQL menggunakan JavaScript dalam Node.js_node.js

1. Wujudkan sambungan pangkalan data: kaedah createConnection(Object)
Kaedah ini menerima objek sebagai parameter Objek mempunyai empat atribut yang biasa digunakan: hos, pengguna, kata laluan dan pangkalan data. Parameter yang sama seperti pautan pangkalan data dalam php. Senarai atribut adalah seperti berikut:

  • hos: Nama hos tempat pangkalan data disambungkan (Lalai: localhost)
  • port: port sambungan (Lalai: 3306)
  • localAddress: Alamat IP digunakan untuk sambungan TCP (Pilihan)
  • socketPath: Laluan ke domain unix. Parameter ini akan diabaikan apabila menggunakan hos dan port
  • pengguna: Nama pengguna pengguna MySQL
  • kata laluan: Kata laluan pengguna MySQL
  • pangkalan data: Nama pangkalan data untuk dipautkan (pilihan
  • ).
  • set aksara: Set aksara sambungan (Lalai: 'UTF8_GENERAL_CI'. Gunakan huruf besar apabila menetapkan nilai ini!)
  • Zon waktu: Zon waktu di mana waktu tempatan disimpan (Lalai: 'setempat')
  • stringifyObjects: Sama ada hendak menyerikan objek Lihat isu #501 (Lalai: 'false')
  • insecureAuth: Sama ada hendak membenarkan kaedah pengesahan lama untuk menyambung ke tika pangkalan data (Lalai: palsu)
  • typeCast: Menentukan sama ada hendak menukar nilai lajur kepada nilai lajur jenis JavaScript asli (Lalai: benar)
  • Format pertanyaan: Fungsi pemformatan pernyataan pertanyaan tersuai
  • supportBigNumbers: Apabila pangkalan data mengendalikan nombor besar (integer panjang dan perpuluhan), ia harus didayakan (lalai: palsu
  • ).
  • bigNumberStrings: Dayakan supportBigNumbers dan bigNumberStrings dan paksa nombor ini dikembalikan sebagai rentetan (lalai: palsu
  • ).
  • dateStrings: Paksa jenis tarikh (TIMESTAMP, DATETIME, DATE) dikembalikan sebagai rentetan dan bukannya objek javascript Date (Lalai: false)
  • nyahpepijat: Sama ada untuk mendayakan penyahpepijatan (Lalai: palsu)
  • multipleStatements: Sama ada untuk membenarkan berbilang pernyataan pertanyaan dihantar dalam satu pertanyaan (Lalai: palsu)
  • bendera: bendera pautan

Anda juga boleh menggunakan rentetan untuk menyambung ke pangkalan data, contohnya:

Salin kod Kod adalah seperti berikut:

sambungan var = mysql.createConnection('mysql://user:pass@host/db?debug=true&charset=BIG5_CHINESE_CI&timezone=-0700';


2. Tamatkan sambungan pangkalan data end() dan musnahkan()
end() menerima fungsi panggil balik dan akan dicetuskan selepas pertanyaan tamat Jika terdapat ralat dalam pertanyaan, pautan masih akan ditamatkan dan ralat akan dihantar ke fungsi panggil balik untuk diproses.
destroy() segera menamatkan sambungan pangkalan data Walaupun pertanyaan tidak selesai, fungsi panggil balik berikutnya tidak akan dicetuskan.

3 Cipta kumpulan sambungan createPool(Object)

Parameter Object dan createConnection adalah sama.

Anda boleh mendengar acara sambungan dan menetapkan nilai sesi

pool.on('connection', function(connection) { 
    connection.query('SET SESSION auto_increment_increment=1') 
  }); 
connection.release() melepaskan sambungan ke kumpulan sambungan. Jika anda perlu menutup sambungan dan memadamkannya, anda perlu menggunakan connection.destroy()

Selain menerima parameter yang sama seperti sambungan, pool juga menerima beberapa parameter lanjutan

createConnection: Fungsi yang digunakan untuk membuat pautan (Lalai: mysql.createConnection)

WaitForConnections: Menentukan kelakuan kumpulan apabila tiada kumpulan sambungan atau bilangan sambungan mencapai maksimum Apabila ia benar, sambungan akan dimasukkan ke dalam baris gilir dan dipanggil apabila ia palsu, ralat akan berlaku dikembalikan serta-merta. (Lalai: benar)
ConnectionLimit: Bilangan maksimum sambungan (Lalai: 10)
QueueLimit: Panjang maksimum permintaan sambungan dalam kumpulan sambungan Jika melebihi panjang ini, ralat akan dilaporkan Apabila nilainya ialah 0, tiada had (Lalai: 0)

4. Kelompok kolam sambungan
Benarkan pautan hos yang berbeza

// create 
  var poolCluster = mysql.createPoolCluster(); 
 
  poolCluster.add(config); // anonymous group 
  poolCluster.add('MASTER', masterConfig); 
  poolCluster.add('SLAVE1', slave1Config); 
  poolCluster.add('SLAVE2', slave2Config); 
 
  // Target Group : ALL(anonymous, MASTER, SLAVE1-2), Selector : round-robin(default) 
  poolCluster.getConnection(function (err, connection) {}); 
 
  // Target Group : MASTER, Selector : round-robin 
  poolCluster.getConnection('MASTER', function (err, connection) {}); 
 
  // Target Group : SLAVE1-2, Selector : order 
  // If can't connect to SLAVE1, return SLAVE2. (remove SLAVE1 in the cluster) 
  poolCluster.on('remove', function (nodeId) { 
   console.log('REMOVED NODE : ' + nodeId); // nodeId = SLAVE1  
  }); 
 
  poolCluster.getConnection('SLAVE*', 'ORDER', function (err, connection) {}); 
 
  // of namespace : of(pattern, selector) 
  poolCluster.of('*').getConnection(function (err, connection) {}); 
 
  var pool = poolCluster.of('SLAVE*', 'RANDOM'); 
  pool.getConnection(function (err, connection) {}); 
  pool.getConnection(function (err, connection) {}); 
 
  // destroy 
  poolCluster.end(); 
Parameter pilihan untuk memautkan kelompok

boleh Cuba Semula: Apabila nilainya benar, cuba semula dibenarkan apabila sambungan gagal (Lalai: benar)

removeNodeErrorCount: Nilai errorCount akan meningkat apabila sambungan gagal Apabila nilai errorCount lebih besar daripada removeNodeErrorCount, nod akan dialih keluar daripada PoolCluster (Lalai: 5)

    pemilih lalai: Pemilih lalai (Lalai: RR)
  • RR: Gelung (Round-Robin)
  • RANDOM: Pilih nod melalui fungsi rawak
  • PESANAN: Memilih nod pertama yang tersedia
  • tanpa syarat

5. Tukar pengguna/tukar status sambungan

Mysql membenarkan menukar pengguna tanpa memutuskan sambungan


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

参数  

  •     user: 新的用户 (默认为早前的一个). 
  •     password: 新用户的新密码 (默认为早前的一个). 
  •     charset: 新字符集 (默认为早前的一个). 
  •     database: 新数据库名称 (默认为早前的一个). 

六、处理服务器连接断开

var db_config = { 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'example' 
  }; 
 
  var connection; 
 
  function handleDisconnect() { 
   connection = mysql.createConnection(db_config); // Recreate the connection, since 
                           // the old one cannot be reused. 
 
   connection.connect(function(err) {       // The server is either down 
    if(err) {                   // or restarting (takes a while sometimes). 
     console.log('error when connecting to db:', err); 
     setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect, 
    }                   // to avoid a hot loop, and to allow our node script to 
   });                   // process asynchronous requests in the meantime. 
                       // If you're also serving http, display a 503 error. 
   connection.on('error', function(err) { 
    console.log('db error', err); 
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually 
     handleDisconnect();             // lost due to either server restart, or a 
    } else {                   // connnection idle timeout (the wait_timeout 
     throw err;                 // server variable configures this) 
    } 
   }); 
  } 
 
  handleDisconnect(); 

七、转义查询值
为了避免SQL注入攻击,需要转义用户提交的数据。可以使用connection.escape() 或者 pool.escape()
例如:

var userId = 'some user provided value'; 
  var sql  = 'SELECT * FROM users WHERE id = ' + connection.escape(userId); 
  connection.query(sql, function(err, results) { 
   // ... 
  }); 
  或者使用?作为占位符 
  connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) { 
   // ... 
  }); 
  不同类型值的转换结果 
  Numbers 不变 
  Booleans 转换为字符串 'true' / 'false'  
  Date 对象转换为字符串 'YYYY-mm-dd HH:ii:ss' 
  Buffers 转换为是6进制字符串 
  Strings 不变 
  Arrays => ['a', 'b'] 转换为 'a', 'b' 
  嵌套数组 [['a', 'b'], ['c', 'd']] 转换为 ('a', 'b'), ('c', 'd') 
  Objects 转换为 key = 'val' pairs. 嵌套对象转换为字符串. 
  undefined / null ===> NULL 
  NaN / Infinity 不变. MySQL 不支持这些值, 除非有工具支持,否则插入这些值会引起错误. 
  转换实例: 
  var post = {id: 1, title: 'Hello MySQL'}; 
  var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) { 
   // Neat! 
  }); 
  console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL' 


    或者手动转换  

  var query = "SELECT * FROM posts WHERE title=" + mysql.escape("Hello MySQL"); 
 
  console.log(query); // SELECT * FROM posts WHERE title='Hello MySQL' 

八、转换查询标识符
如果不能信任SQL标识符(数据库名、表名、列名),可以使用转换方法mysql.escapeId(identifier);

var sorter = 'date'; 
  var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId(sorter); 
 
  console.log(query); // SELECT * FROM posts ORDER BY `date` 
  支持转义多个 
  var sorter = 'date'; 
  var query = 'SELECT * FROM posts ORDER BY ' + mysql.escapeId('posts.' + sorter); 
 
  console.log(query); // SELECT * FROM posts ORDER BY `posts`.`date` 
  可以使用??作为标识符的占位符 
  var userId = 1; 
  var columns = ['username', 'email']; 
  var query = connection.query('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId], function(err, results) { 
   // ... 
  }); 
 
  console.log(query.sql); // SELECT `username`, `email` FROM `users` WHERE id = 1 

九、准备查询
可以使用mysql.format来准备查询语句,该函数会自动的选择合适的方法转义参数。

var sql = "SELECT * FROM ?? WHERE ?? = ?"; 
  var inserts = ['users', 'id', userId]; 
  sql = mysql.format(sql, inserts); 
  10、自定义格式化函数 
  connection.config.queryFormat = function (query, values) { 
   if (!values) return query; 
   return query.replace(/\:(\w+)/g, function (txt, key) { 
    if (values.hasOwnProperty(key)) { 
     return this.escape(values[key]); 
    } 
    return txt; 
   }.bind(this)); 
  }; 
 
  connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" }); 

十、获取插入行的id
当使用自增主键时获取插入行id,如:

connection.query('INSERT INTO posts SET ?', {title: 'test'}, function(err, result) { 
   if (err) throw err; 
 
   console.log(result.insertId); 
  }); 

十一、流处理
有时你希望选择大量的行并且希望在数据到达时就处理他们,你就可以使用这个方法

var query = connection.query('SELECT * FROM posts'); 
  query 
   .on('error', function(err) { 
    // Handle error, an 'end' event will be emitted after this as well 
   }) 
   .on('fields', function(fields) { 
    // the field packets for the rows to follow 
   }) 
   .on('result', function(row) { 
    // Pausing the connnection is useful if your processing involves I/O 
    connection.pause(); 
 
    processRow(row, function() { 
     connection.resume(); 
    }); 
   }) 
   .on('end', function() { 
    // all rows have been received 
   }); 

十二、混合查询语句(多语句查询)
 因为混合查询容易被SQL注入攻击,默认是不允许的,可以使用var connection = mysql.createConnection({multipleStatements: true});开启该功能。
 混合查询实例:

connection.query('SELECT 1; SELECT 2', function(err, results) { 
   if (err) throw err; 
 
   // `results` is an array with one element for every statement in the query: 
   console.log(results[0]); // [{1: 1}] 
   console.log(results[1]); // [{2: 2}] 
  }); 

同样可以使用流处理混合查询结果:

var query = connection.query('SELECT 1; SELECT 2'); 
 
  query 
   .on('fields', function(fields, index) { 
    // the fields for the result rows that follow 
   }) 
   .on('result', function(row, index) { 
    // index refers to the statement this result belongs to (starts at 0) 
   }); 

如果其中一个查询语句出错,Error对象会包含err.index指示错误语句的id,整个查询也会终止。
混合查询结果的流处理方式是做实验性的,不稳定。

十三、事务处理
connection级别的简单事务处理

connection.beginTransaction(function(err) { 
   if (err) { throw err; } 
   connection.query('INSERT INTO posts SET title=?', title, function(err, result) { 
    if (err) {  
     connection.rollback(function() { 
      throw err; 
     }); 
    } 
 
    var log = 'Post ' + result.insertId + ' added'; 
 
    connection.query('INSERT INTO log SET data=?', log, function(err, result) { 
     if (err) {  
      connection.rollback(function() { 
       throw err; 
      }); 
     }  
     connection.commit(function(err) { 
      if (err) {  
       connection.rollback(function() { 
        throw err; 
       }); 
      } 
      console.log('success!'); 
     }); 
    }); 
   }); 
  }); 

十四、错误处理

err.code = string 
err.fatal => boolean 


PS:使用mysql模块时遇到的坑
之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题。放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误。于是上服务器检查了遍,发现程序仍然在运行,且能正确记录每次的请求,再修改代码跟踪调试,原来是在查询数据库的时候,回调一直没有被执行,程序就挂在那里了。

想了很久也想不明白为神马mysql模块没有执行回调,最后突然想起来去看了下错误日志,才发现有个“No reconnection after connection lost”错误没有被捕捉到,原来是连接丢失了,上github上看了下文档和issues,上面说到连接丢失后不会自动重新连接,会触发error事件。我赶紧给程序添加了断线后自动重连功能,现在已正常运行了10多天。

MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。

自动重连数据库的代码:

function handleError (err) {
 if (err) {
  // 如果是连接断开,自动重新连接
  if (err.code === 'PROTOCOL_CONNECTION_LOST') {
   connect();
  } else {
   console.error(err.stack || err);
  }
 }
}

// 连接数据库
function connect () {
 db = mysql.createConnection(config);
 db.connect(handleError);
 db.on('error', handleError);
}

var db;
connect();

网上流传的大多数使用mysql模块的代码,往往忽略了这个问题,一不小心就让一拨又一拨的人往坑里踩了。
有童鞋回复问使用pool又会怎样,于是去看了下mysql模块的源码:目前可在npm中安装到的最新版本为2.0.0-alpha7,使用mysql.createPool()来创建的pool没办法自动处理连接被关闭的问题,但是在github上的版本已经修复了(应该还没发布到npm上),当触发了connection的error事件时,会把该connection对象从连接池中移除。(源码:https://github.com/felixge/node-mysql/blob/master/lib/Pool.js#L119 )
使用pool的代码:

var mysql = require('mysql');
var pool = mysql.createPool(config);

pool.getConnection(function(err, connection) {
 // Use the connection
 connection.query( 'SELECT something FROM sometable', function(err, rows) {
  // And done with the connection.
  connection.end();

  // Don't use the connection here, it has been returned to the pool.
 });
});

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
JavaScript: meneroka serba boleh bahasa webJavaScript: meneroka serba boleh bahasa webApr 11, 2025 am 12:01 AM

JavaScript adalah bahasa utama pembangunan web moden dan digunakan secara meluas untuk kepelbagaian dan fleksibiliti. 1) Pembangunan front-end: Membina laman web dinamik dan aplikasi satu halaman melalui operasi DOM dan kerangka moden (seperti React, Vue.js, sudut). 2) Pembangunan sisi pelayan: Node.js menggunakan model I/O yang tidak menyekat untuk mengendalikan aplikasi konkurensi tinggi dan masa nyata. 3) Pembangunan aplikasi mudah alih dan desktop: Pembangunan silang platform direalisasikan melalui reaktnatif dan elektron untuk meningkatkan kecekapan pembangunan.

Evolusi JavaScript: Trend Semasa dan Prospek Masa DepanEvolusi JavaScript: Trend Semasa dan Prospek Masa DepanApr 10, 2025 am 09:33 AM

Trend terkini dalam JavaScript termasuk kebangkitan TypeScript, populariti kerangka dan perpustakaan moden, dan penerapan webassembly. Prospek masa depan meliputi sistem jenis yang lebih berkuasa, pembangunan JavaScript, pengembangan kecerdasan buatan dan pembelajaran mesin, dan potensi pengkomputeran IoT dan kelebihan.

Demystifying JavaScript: Apa yang berlaku dan mengapa pentingDemystifying JavaScript: Apa yang berlaku dan mengapa pentingApr 09, 2025 am 12:07 AM

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Adakah Python atau JavaScript lebih baik?Adakah Python atau JavaScript lebih baik?Apr 06, 2025 am 12:14 AM

Python lebih sesuai untuk sains data dan pembelajaran mesin, manakala JavaScript lebih sesuai untuk pembangunan front-end dan penuh. 1. Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya, dan sesuai untuk analisis data dan pembangunan web. 2. JavaScript adalah teras pembangunan front-end. Node.js menyokong pengaturcaraan sisi pelayan dan sesuai untuk pembangunan stack penuh.

Bagaimana saya memasang javascript?Bagaimana saya memasang javascript?Apr 05, 2025 am 12:16 AM

JavaScript tidak memerlukan pemasangan kerana ia sudah dibina dalam pelayar moden. Anda hanya memerlukan editor teks dan penyemak imbas untuk memulakan. 1) Dalam persekitaran penyemak imbas, jalankan dengan memasukkan fail HTML melalui tag. 2) Dalam persekitaran Node.js, selepas memuat turun dan memasang node.js, jalankan fail JavaScript melalui baris arahan.

Bagaimana cara menghantar pemberitahuan sebelum tugas bermula di kuarza?Bagaimana cara menghantar pemberitahuan sebelum tugas bermula di kuarza?Apr 04, 2025 pm 09:24 PM

Cara Menghantar Pemberitahuan Tugas di Quartz terlebih dahulu Apabila menggunakan pemasa kuarza untuk menjadualkan tugas, masa pelaksanaan tugas ditetapkan oleh ekspresi cron. Sekarang ...

Dalam JavaScript, bagaimana untuk mendapatkan parameter fungsi pada rantaian prototaip dalam pembina?Dalam JavaScript, bagaimana untuk mendapatkan parameter fungsi pada rantaian prototaip dalam pembina?Apr 04, 2025 pm 09:21 PM

Cara mendapatkan parameter fungsi pada rantaian prototaip dalam JavaScript dalam pengaturcaraan JavaScript, pemahaman dan memanipulasi parameter fungsi pada rantaian prototaip adalah tugas yang biasa dan penting ...

Apakah sebab kegagalan perpindahan gaya dinamik Vue.js dalam program WeChat Mini Webview?Apakah sebab kegagalan perpindahan gaya dinamik Vue.js dalam program WeChat Mini Webview?Apr 04, 2025 pm 09:18 PM

Analisis sebab mengapa kegagalan anjakan gaya dinamik menggunakan vue.js dalam pandangan web applet weChat menggunakan vue.js ...

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.