از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
ادغام MySQL با Node.js ApplicationsMySQL یک سیستم مدیریت پایگاه داده رابطهای (RDBMS) بسیار محبوب است – و برای مدت طولانی یکی از اصلیترین ابزارهای مهندسین پشتیبان، درست در کنار PostgreSQL بوده است. با ظهور جاوا اسکریپت برای back-end، از طریق افزایش چشمگیر Node.js در محبوبیت و کاربرد – MySQL معمولا…
سرفصلهای مطلب
معرفی
MySQL بسیار محبوب است سیستم مدیریت پایگاه داده رابطه ای (RDBMS) – و برای مدت طولانی یکی از اصلی ترین ابزارهای مهندسین پشتیبان، درست در کنار PostgreSQL بوده است.
با ظهور جاوا اسکریپت برای back-end، از طریق افزایش چشمگیر Node.js در محبوبیت و کاربرد – MySQL معمولاً به عنوان پایگاه داده برای پروژه ها و برنامه های ساخته شده با Node استفاده می شود.
در این راهنما، ما نگاهی به روش ادغام MySQL با یک برنامه Node.js خواهیم داشت. ما از طریق تنظیمات عبور می کنیم process، عملیات CRUD را به صورت برنامه نویسی انجام دهید و با فرار از ورودی و تنظیم بازه های زمانی، نگاهی به امنیت پرس و جو اولیه بیندازید.
توجه داشته باشید: در سراسر راهنما، ما به npm
درایور MySQL به عنوان mysql
، و خود پایگاه داده MySQL به عنوان MySQL.
راه اندازی MySQL
برای کار با MySQL – باید آن را دانلود کنید پایگاه داده MySQL و host یک سرور کوچک روی ماشین محلی شما نسخه انجمن کاملا رایگان است!
همچنین می توانید انتخاب کنید که یک وب سرور منبع باز با پشتیبانی از پایگاه داده MySQL (Xampp، لامپ) – آنها با درایور MySQL Node نیز عالی کار می کنند.
نصب کننده ساده است، و هنگامی که یک نمونه سرویس را راه اندازی کردید، می توانید یک پروژه برای اتصال به آن ایجاد کنید!
درایور MySQL برای پروژه های Node
با فرض اینکه سرور در حال اجرا است، می توانید از طریق برنامه Node و با استفاده از درایور با آن به صورت برنامه نویسی ارتباط برقرار کنید. برای اینکه یک اپلیکیشن این قابلیت را داشته باشد، باید a را نصب کنید درایور MySQL. یک راننده موجود است روی npm
مانند mysql
!
برای شروع، اجازه دهید یک دایرکتوری جدید ایجاد کنیم host برنامه ما و یک پروژه Node جدید را با تنظیمات پیشفرض مقداردهی اولیه کنید:
$ mkdir mysql-app
$ cd mysql-app
$ npm init -y
این یک جدید تولید می کند package.json
که حاوی ابرداده های اصلی پروژه ما است. پس از انجام این کار، می توانیم آن را نصب کنیم node بسته درایور MySQL از طریق npm
:
$ npm install mysql
با بررسی ما می توانیم تأیید کنیم که نصب با موفقیت انجام شده است package.json
فایل، جایی که باید یک ورودی جدید برای آن پیدا کنیم mysql
اضافه شده در زیر dependencies
:
...
"dependencies": {
"mysql": "^2.18.1"
}
توجه داشته باشید: ^2.18.1
نشان دهنده شماره نسخه است و بسته به آن متفاوت خواهد بود روی نسخه MySQL که نصب کرده اید.
برقراری ارتباط
یک شی اتصال را می توان از طریق ایجاد کرد createConnection()
عملکرد از mysql
نمونه، مثال. سپس می توان از این شی برای ایجاد ارتباط بین سرور و کلاینت/درایور استفاده کرد! سه پارامتر را می پذیرد:
- میزبان –
host
از پایگاه داده شما مقدار پیش فرض است'localhost'
. - کاربر – نام کاربری مدیر پایگاه داده مجاز. مقدار پیش فرض است
'root'
. - کلمه عبور – رمز عبور مجاز مدیر پایگاه داده. مقدار پیش فرض یک رشته خالی (بدون رمز عبور) است.
- پایگاه داده – یک آرگومان اختیاری که نام پایگاه داده را که می خواهید تغییراتی در آن اعمال کنید، تعریف می کند.
با در نظر گرفتن این موارد، بیایید پیش فرض را باز کنیم index.js
فایل – و ما می توانیم به یک سرور MySQL با استفاده از:
var mysql = require("mysql");
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
});
connection.connect((err) => {
if (err) {
console.log("Error occurred", err);
} else {
console.log("Connected to MySQL Server");
}
});
هنگامی که یک اتصال پیکربندی شد، می توانید به سادگی connect()
به سرور! این connect()
تابع از یک تماس برگشتی استفاده می کند که به شما امکان می دهد بررسی کنید که آیا اتصال موفق بوده است یا خیر.
نوشتن پرس و جو از طریق جاوا اسکریپت
تقریباً تمام اقداماتی که باید در پایگاه داده MySQL انجام دهید از طریق آن انجام می شود پرس و جوها، به طور طبیعی با SQL نوشته شده است. این query()
روش از connection
نمونه رشته ای را می پذیرد که نشان دهنده پرس و جوی است که می خواهیم به پایگاه داده ارسال کنیم.
ممکن است یک کوئری با شکست مواجه شود یا نتیجه ای را برگرداند، بنابراین ما یک تماس دیگر با هر یک از آن ها خواهیم داشت err
یا result
مستقر روی عملیات چگونه پیش رفت
ایجاد پایگاه داده
بیایید با ایجاد یک پایگاه داده از طریق درایور MySQL Node شروع کنیم. می توانید یک پایگاه داده ایجاد کنید روی سرور از طریق CLI (اگر آن را نصب کرده باشید) یا از طریق هر شکلی از رابط کاربری گرافیکی – رسمی یا شخص ثالث نیز.
از طرف دیگر، میتوانید از اتصالی که ما ایجاد کردهایم برای ارسال درخواستی استفاده کنید که یک پایگاه داده برای شما ایجاد میکند! بیایید یک جدید ایجاد کنیم students_records
پایگاه داده در پروژه root دایرکتوری، در همان index.js
ما قبلا استفاده کرده ایم، بیایید a اضافه کنیم query()
در صورت موفقیت آمیز بودن اتصال، پس از اتصال به پایگاه داده تماس بگیرید:
var mysql = require("mysql");
// Create connection configuration
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
});
// Connect to the server
connection.connect((err) => {
if (err) {
// Return error if present
console.log("Error occurred", err);
} else {
// Create database
console.log("Connected to MySQL Server");
const query = "CREATE DATABASE students_records";
connection.query(query, function (err, result) {
if (err) {
err;
}
console.log("New database created");
});
}
});
پس از تأیید برای اینکه ببینیم آیا اتصال ما موفقیت آمیز بوده است، یک پرس و جو را با یک رشته کوئری اجرا کردیم – 'CREATE DATABASE students_records'
، که در صورت عدم وجود یک پایگاه داده جدید ایجاد می کند. حالا بیایید پروژه را اجرا کنیم:
$ node index.js
که منجر به:
Connected to MySQL Server
New database created
عالی! حالا که الف students_records
پایگاه داده وجود دارد، ما می توانیم پرس و جو ایجاد پایگاه داده را حذف کنیم و مستقیماً به آن متصل شویم students_records
در عوض در پیکربندی:
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "students_records",
});
ایجاد رکوردها
درست مانند هر پایگاه داده رابطهای دیگر، رکوردهای داده در MySQL در آن ذخیره میشوند جداول با ستون ها و ردیف ها. یک جدول می تواند از هر تعداد دلخواه ستون و ردیف تشکیل شده باشد، اما آنها باید سازگار باشد. ستونهای پایگاه داده نمایانگر ویژگیها/فیلدهای یک شی هستند و هر ردیف نشاندهنده یک ورودی است.
هر سطر باید یک مقدار برای هر ستون و فقط آن ستون ها داشته باشد، حتی اگر فقط باشد
NULL
. طرح واره باید برای هر پایگاه داده رابطه ای ثابت بماند.
این بدان معناست که برای افزودن رکوردهای جدید به پایگاه داده خود، باید یک جدول ایجاد کنیم و طرحواره آن (ستون ها و انواع برای هر کدام) را تعریف کنیم.
برای ایجاد یک جدول جدید در MySQL، از CREATE TABLE
بیانیه. بگویید ما می خواهیم یک ایجاد کنیم students
جدول در ما students_records
پایگاه داده دوباره، پس از اتصال، میتوانیم کوئری مربوطه را اجرا کنیم:
var mysql = require("mysql");
var connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "students_records",
});
connection.connect((err) => {
if (err) {
console.log("Error occurred", err);
} else {
console.log("Connected to database");
var sql = "CREATE TABLE students (id INT, name VARCHAR(255), course VARCHAR(255))";
connection.query(sql, function (err, result) {
if (err) {
console.log(err);
}
console.log("New table created");
});
}
});
این یک جدول جدید ایجاد می کند که می تواند رکوردها را با آن نگه دارد name
و course
زمینه های! هر ورودی دارای یک name
و course
، حتی اگر برخی از آنها باطل باشد. علاوه بر این، ما نوع آنها را به صورت of قرار داده ایم VARCHAR
با حداکثر طول 255 کاراکتر.
اینجاست که میتوانید محدودیتهای دیگری مانند اجباری بودن فیلدهای خاص را نیز تنظیم کنید.NOT NULL
)، یا PRIMARY KEY
/FOREIGN KEY
:
CREATE TABLE students (
id INT NOT NULL,
name VARCHAR(255) NOT NULL,
course VARCHAR(255) NOT NULL,
PRIMARY KEY (ID)
)
در اینجا، هیچ یک از فیلدها را نمی توان تنظیم کرد NULL
، و هر یک از آنها دارای یک نوع داده مرتبط هستند.
توجه داشته باشید: در SQL، مهم نیست که کلمات کلیدی را با حروف بزرگ بنویسید یا نه. create table
از نظر عملکردی معادل است CREATE TABLE
، مانند varchar
است به VARCHAR
. استفاده از دستورات، کلمات کلیدی و محدودیتها یک قرارداد رایج است، هرچند، این یک الزام نیست.
رکورد ایجاد کنید
این INSERT INTO
پرس و جو و به دنبال آن نام جدول و VALUES
نگاشت به ستون های آن برای درج/ایجاد رکورد با SQL استفاده می شود! به عنوان مثال، بیایید a اضافه کنیم John Doe
به ما students
جدول:
var sql = "INSERT INTO students (id, name, course) VALUES (1, 'John Doe', 'Computer Science')";
این عبارت، بدون تعجب، یک رکورد (ردیف) را در قسمت وارد می کند students
جدول، با مقادیر برای name
و course
. پرس و جو، طبق معمول، می تواند از طریق اجرا شود connection.query()
:
var sql = "INSERT INTO students (id, name, course) VALUES (1, 'John Doe', 'Computer Science')";
// Just execute
connection.query(sql);
// Or execute with callback to handle results/errors
connection.query(sql, function (err, result) {
// ...
});
خواندن سوابق
ما فقط نمیخواهیم دادهها را ذخیره کنیم، بلکه میخواهیم بتوانیم آنها را بخوانیم. و همانطور که در زیر مشاهده می شود، می توانیم داده ها را از آن بازیابی کنیم students
میز با SELECT
پرس و جو.
ما می توانیم رکوردهای خاصی را انتخاب کنیم یا از یک علامت عام استفاده کنیم (*
) برای انتخاب همه موارد موجود:
var sql = "SELECT * FROM students";
connection.query(sql, function (err, result) {
console.log(result);
});
اجرای این کد تمام داده های موجود در جدول ما را برمی گرداند:
(
RowDataPacket { id: 1, name: 'John Doe', course: 'Computer Science' },
RowDataPacket { id: 2, name: 'Jane Doe', course: 'Art' }
)
علاوه بر این می توانید از BETWEEN
عبارت برای ایجاد محدوده ای از ردیف های منطبق:
SELECT * FROM students WHERE id BETWEEN 1 AND 5
که همه دانش آموزانی را که شناسه آنها بین 1 تا 5 است برمی گرداند.
به روز رسانی سوابق
ما می توانیم استفاده کنیم UPDATE
بیانیه ای برای به روز رسانی جداول پایگاه داده و محتویات آنها. به عنوان مثال، شما می توانید از چندین عبارت برای شناسایی یک رکورد خاص و به روز رسانی آن رکورد استفاده کنید. به طور کلی، یک id
باید یک باشد PRIMARY KEY
برای شناسایی یک ردیف، و همچنین یک مقدار منحصر به فرد، بنابراین id
معمولاً ستونی است که توسط آن می توان رکوردها را جستجو کرد.
بگویید می خواهیم دانش آموز را به روز کنیم، John Doe
‘s، البته از Computer Science
به Art
، در کنار پسر عمویش. جان id
است 1
:
var sql = "UPDATE students SET course = 'Art' WHERE id = 1";
connection.query(sql, function (err, result) {
console.log(result);
});
نتیجه پرس و جوی مانند این معمولاً شامل جزئیاتی در مورد روش تأثیر پرس و جو بر جدول است، به این ترتیب می توانید تأیید کنید که آیا نتیجه آن طور که می خواستید کار کرده است یا خیر:
{
fieldCount: 0,
affectedRows: 1,
insertId: 1,
serverStatus: 34,
warningCount: 0,
message: '(Rows matched: 1 Changed: 1 Warnings: 0',
protocol41: true,
changedRows: 1
}
حذف رکوردها
در نهایت، برای حذف رکوردها – از DELETE
بیانیه، و مشخص کنید که کدام رکوردها حذف شوند:
var sql = "DELETE FROM students WHERE id = 1";
connection.query(sql, function (err, result) {
console.log(result);
});
توجه داشته باشید: هنگام استفاده از آن باید مراقب باشید DELETE
بیانیه، و مشخص کنید WHERE
بند با دقت علاوه بر این، اگر شما را مشخص نکنید WHERE
بند، کل مطالب جدول پاک خواهد شد.
فرار از مقادیر پرس و جو
زمانی که مهندسان نرم افزار اجازه دادند از ورودی کاربر در فراخوانی های SQL استفاده شود، یک سوء استفاده اولیه رایج کشف شد. به عنوان مثال، می توانید یک نوار جستجو با یک فیلد ورودی داشته باشید. کاربر نام یک کتاب را درج می کند و آن ورودی در یک پرس و جو استفاده می شود مانند:
SELECT * FROM books WHERE name = user_input
این user_input
به طور طبیعی، با یک رشته جایگزین می شود، مانند 'Foundation'
. با این حال، این دری را برای شما باز می کند بزرگ اکسپلویت ها، که به سادگی فرار از پرس و جوی ساخته شده و اجرای خود هستند.
به عنوان مثال، اگر سیستم به گونه ای ساخته شده بود که ساده لوحانه ورودی را بپذیرد و آن را در پرس و جو وارد کند، برای کاربر کافی است که وارد شود. a; DROP TABLE books
برای سوء استفاده از درخواست شما:
SELECT * FROM books WHERE name = a; DROP TABLE books
نقطه ویرگول عبارت قبلی را تمام میکند و عبارت بعدی در ردیف اجرا میشود، کل جدول را از پایگاه داده حذف میکند و همه کتابها را حذف میکند. این یک مثال ساده از تزریق SQL، و حملات می توانند بسیار پیچیده تر از این باشند. علاوه بر این، همه حملات نمی توانند مخرب باشند – یک مهاجم ممکن است فقط داده های حساس را بخواند، که یک حمله خاموش است که معمولاً زیر رادار می رود.
با توجه به شیوع این حملات – اکثر بسته ها دارای امنیت داخلی اولیه هستند. این mysql
درایور ساخته شده برای Node عملکردها و اقداماتی را برای جلوگیری از تزریق SQL ارائه می دهد.
رایج ترین روش این است فرار از ارزش ها و به جای آن از آنها به عنوان پارامترهای نامگذاری شده استفاده کنید:
const input = 'Foundation';
connection.query('SELECT * FROM books WHERE name = ?', (input), function (err, results, fields) {
// ...
});
با استفاده از ?
کاراکتر escape – شما از ورودی فرار می کنید و آن را به یک رشته واقعی تبدیل می کنید که قابل ارزیابی نیست. اگر شخصی دستوری را در فیلد ورودی وارد کند که به این پارامتر منتهی می شود – به عنوان یک فرمان ارزیابی نمی شود. به عنوان یک رشته تحت اللفظی در نظر گرفته می شود، و یک پرس و جو برای یافتن کتابی که نام آن با آن دستور مطابقت دارد، ارسال می شود.
این متد آرایه ای از پارامترها را می پذیرد که به صورت متوالی در پرس و جو وارد می شوند. اگر پرس و جو دارای 2 پارامتر حاشیه نویسی باشد، اولین مورد در لیست به پارامتر اول و موارد دوم در لیست به پارامتر دوم نگاشت می شود.
همچنین، می توانید این مقادیر را به صراحت از طریق قالب بندی رشته جاوا اسکریپت تزریق کنید و از escape()
هر چند روشی برای فرار از دستورات ممکن – این رویکرد معمولاً کمتر قابل خواندن است:
const input = mysql.escape('Foundation');
connection.query(`SELECT * FROM books WHERE name = ${input}`, function (err, results, fields) {
// ...
});
تنظیم زمان وقفه
هر عملیات مربوط به اتصال پس از یک دوره زمانی پیشفرض خاتمه مییابد، و ما میتوانیم این مشکل را با تنظیم جلسه مهلت زمانی ترجیحی خود برطرف کنیم. این کار با ارسال یک شی به .query()
تابع، با پرس و جو ما و جلسه وقفه (بر حسب میلی ثانیه) به عنوان فیلدهای آن شی:
connection.query({sql: 'SELECT * FROM students', timeout: 50000}, function (err, results) {
// ...
});
این کد a اجرا خواهد شد SELECT
پرس و جو که در صورت عدم بازگشت نتیجه پس از 50 ثانیه خاتمه می یابد.
نتیجه
MySQL یک پایگاه داده رابطه ای رایج است. در این راهنما، ما نگاهی به روش نصب درایورهای سرور MySQL برای پروژه Node.js، روش برقراری ارتباط با سرور و انجام عملیات CRUD انداخته ایم.
در نهایت، ما به اهمیت فرار از ورودی کاربر اشاره کردهایم و نگاهی به سفارشیسازی دورههای وقفه انداختهایم.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-13 05:30:07