نوشتن کوئری Mysql  در Node.js

تقریبا یک سال پیش یک پروژه میخواستم روی الکترون انجام بدم که نیاز داشتم به کوئری زدن mysql . به این دلیل که پایگاه داده از قبل درست شده بود و نمیشد کاریش کرد . منم روی node.js با mongoos کار میکردم و اتفاق نیفتاده بود که برم روی mysql برای node.js . خیلی نگشتم . داخل npm خیلی راحت پیداش کردم . این صفحه npm برای mysql : https://www.npmjs.com/package/mysql خوب حالا بریم سر اصل مطلب . اینکه چجوری از این پکیج استفاده کنیم . اول از همه نصب رو انجام بدیم :npm install mysqlخیلی راحته و برای استفاده داخل node.js باید require کنیم . var mysql = require('mysql');حالا دسترسی کامل به mysql داریم و با متغیر mysql میتونیم به آبجکت هایی که میخوایم برسیم . اول از همه باید کانکشن رو ایجاد کنیم . var connection = mysql.createConnection({ host : 'localhost', user : 'nima_nodejs', password : 'something', database : 'nodejs' }); connection.connect(function(err) { if (err) throw err; console.log("Connected! Yeahhhh"); });خوب حالا اگر فایل رو اجرا کنیم و تنظیمات رو درست ست کرده باشیم ، داخل ترمینال پیغام connected! Yeahh رو میگیریم . نوبت میرسه به نوشتن کوئری ها . مثال بالا رو تغییر میدم :‌var connection = mysql.createConnection({ host : 'localhost', user : 'me', password : 'secret', database : 'my_db }); connection.connect(); //Now Connected connection.query('SELECT * FROM users where user_id=1', function (error, users, fields) { if (error) throw error; console.log('We find user : ', users[0].name); //now it will print name of users }); connection.end();داخل مثال بالا ما یک سلکت ساده زدیم با یک شرط که کاربر با آی دی 1 رو بگیریم و نتیجه رو ریختیم داخل users تا بتونیم ازش استفاده کنیم . نوشتن کوئری با پرفونس بالاتر با استفاده از Connection pool https://en.wikipedia.org/wiki/Connection_pool این مورد شاید خیلی نیاز نباشه اما جالب و خاصهاول از همه بگم که pool یا استخر چیه . استخر کانکشن ها ، به این معنیه که ما چندین کانکشن ایجاد میکنیم و در شرایط داینامیک برای کلاستر کردم ، ازشون استفاده میکنیم . این مورد میتونه برای ارتباطات روی ریکوئست های خیلی بالا کمک کنه بهتون تا کاربر کوئری kill نشده نداشته باشه . وقتی که شما میخواین یک کانکشن رو تغییر بدید به صورت داینامیک ، باید کانکشن قبلی رو حتما kill کنین ، در غیر این صورت خیلی به سرور بار اضافه میکنه . دقیقا کار استخر کانکشن همینه که شما بتونین این کلاسترینگ رو با مدیریت کمتری انجام بدید . مثال زیرو ببینید :‌var mysql = require('mysql'); var pool = mysql.createPool({ connectionLimit : 10, host : 'nima_nodejs.org', user : 'nima_nodejs', password : 'something', database : 'node_js' }); pool.query('SELECT * FROM users', function (error, users, fields) { if (error) throw error; console.log('User: ', users[0].name); });مقدار connectionLimit به این معنیه که شما چه تعداد کانکشن میخواین بسازین که داخل استخر زنده بمونن . مقدار پیشفرض هم روی 10 هست . این مفهوم رو که خوب باهاش کار کنین میتونین با قابلیت poolCluster به صورت خیلی زیبا و راحت ، کلاسترینگ رو انجام بدید روی دیتابیس . اما باز هم میگم که این کار ها برای داکر قابل اجرا نیست و حتما باید mysql خارج کانتینر داکر باشه . نحوه جلوگیری از Sql Injection :خوب همه زبان هایی که با sql کار میکنن ، escape کردن رو داخل mysql روی پکیج ها طراحی میکنن و وجود داره . پس ببینیم داخل کد زیر که چجوری میشه یک select ‌امن انجام داد :var userId = 1; var sql = 'SELECT * FROM users WHERE id = ' + connection.escape(userId); connection.query(sql, function (error, users, fields) { if (error) throw error; // ... });خوب دیدین خیلی راحته و خیلی کاربردی هم هست حتما براتون . میتونین از placeholder هم استفاده کنین به صورت زیر: connection.query('SELECT * FROM users WHERE id = ?', [userId], function (error, users, fields) { if (error) throw error; // ...});داخل کد بالا دقت کنین که اول توی کوئری به جای مقدار userid علامت سوال میزاریم و بعدش داخل پارامتر بعدی به شکل آرایه ، مقدار مربوط بهش رو پاس میدیم . حالا کد زیر هم ببینید برای چند placeholdervar age=35; var userId= 1; connection.query('SELECT * FROM users WHERE id = ? AND age = ?', [userId,age], function (error, users, fields) { if (error) throw error; // ...});خوب فکر کنم خوب و کافی باشه . میتونین از لینک ریپوزیتوری که اول صفحه دادم مطالب بهتر و کامل تری رو بخونین . دستورات mysql رو اینجا نمیخواستم بگم . فرض بر اینه که میدونید . ارادت .