ایجاد Web API با استفاده از Node.js و MySQL
چهارشنبه 1 دی 1395در این مقاله ، به بررسی چگونگی ایجاد یک RESTful API ساده با استفاده از node.js و MySQL به عنوان پایگاه داده خواهیم پرداخت . و در ادامه ی مقاله مثالی را ارائه خواهیم داد و بصورت مرحله به مرحله به بررسی آن خواهیم پرداخت .
آیا میدانید ایجاد RESTful API با استفاده از node.js و Express Template به راحتی آب خوردن میباشد ؟؟
در صورتی که به یادگیری اصولی و حرفه ای این تکنولوژی قدرتمند علاقمند هستید میتوانید دوره کامل و جامع آموزش Node Js موجود در سایت تاپ لرن را مشاهده کنید .
ما کار خود را با پیاده سازی عملیات Craete , Read , Update , Delete) CRUD) با استفاده از Node.s شروع خواهیم کرد . API ما درخواست های GET, POST , PUT , DELETE را خواهد پذیرفت .
قبل از شروع به کار برای ایجاد API با استفاده از Node.js ، در زیر به یکسری از تنظیماتی که باید اعمال شوند اشاره خواهیم کرد . همچنین شما به MySQL نیاز دارید .
تنظیمات :
• node.js را نصب کنید .
• Express generator را نصب کنید .
cmd> npm install express -generator -g
• Express Template از Node.js را نصب کنید :
cmd> express
در اینجا ، در این مثال ، ما از Express Template برای Node.js استفاده میکنیم . کد بالا یک پروژه ساده Node.js را برای ما آماده میکند
• وابستگی ها را برای MySQL نصب کنید :
cmd> npm install mysql --save
ما از MYSQL به عنوان پایگاه داده استفاده خواهیم کرد ، بنابراین نیاز است که وابستگی های آن را در پروژه پیاده سازی کنیم . با نوشتن دستور بالا ، وابستگی ها را در فایل Package.Json به پروژه اضافه میکنیم .
• Cors را نصب کنید :
cmd> npm install cors --save
همانطور که میدانید ، cross -origin resource sharing) CORS) در زمان ایجاد Web API بسیار مهم است ، در واقع با نوشتن دستور بالا وابستگی ها را به فایل Package.Json اصافه میکنیم .
• حال تمام وابستگی های فایل Package.json را نصب کنید :
cmd> npm
جداول را در MySQL تنظیم کنید :
script file for table[code language = "sql"] CREATE TABLE IF NOT EXISTS `task` (`Id` varchar(50) NOT NULL, `Title` varchar(500) DEFAULT NULL, `Status` varchar(100) DEFAULT NULL, PRIMARY KEY(`Id`)) ENGINE = InnoDB DEFAULT CHARSET = latin1; --Dumping data for table `task` -- INSERT INTO `task` (`Id`, `Title`, `Status`) VALUES('1', 'Go to Market tomorrow', 'done'), ('2', 'Email to manager', 'pending'), ('3', 'Push code to GitHub', 'done'), ('4', 'Go For Running', 'done'), ('5', 'Go to Movie', 'pending'); [/code]
ایجاد API با استفاده از Node.Js :
حال که ، تنظیمات محیطی و پایگاه داده خود را انجام داده ایم ، ما نیاز به یک فایل برای ایجاد ارتباط با پایگاه داده داریم . بنابراین ، به سراغ ایجاد یک فایل با نام dbconnection.js میرویم که در داخل این فایل ، اطلاعات لازم برای اتصال به پایگاه داده را خواهیم نوشت . در مثال زیر ، ما به local database ای که در کد بالا ایجاد کردیم متصل شدیم . شما با تغییر دادن اطلاعات Username و Password و hosting Name می توانیم به پایگاه داده خود متصل شوید .
ایجاد dbconnection.jd :
[code language = "javascript"] var mysql = require('mysql'); var connection = mysql.createPool({ host: 'localhost', user: 'root', password: '', database: 'demo' }); module.exports = connection; [/code]
ایجاد Task Model :
در داخل فولدر Model فایل Task.js را ایجاد کنید ، همانند زیر :
زمانی که تنظیمات مربوط به اتصال به پایان رسید ، حال ما Model را برای Task ایجاد میکنیم . یک فولدر با نام models ایجاد کنید و درداخل این فولدر،یک فایل Task.js ایجاد کنید.Task modelما شامل 5 متد خواهد بود.getAllTasks, getTaskById, addTask, updateTask, و deleteTask
ابتدا باید به سراغ dbconnection moduleای برویم که بیشتر آن را ایجاد کردیم .
Task.js :
[code language = "javascript"] var db = require('../dbconnection'); //reference of dbconnection.js var Task = { getAllTasks: function(callback) { return db.query("Select * from task", callback); }, getTaskById: function(id, callback) { return db.query("select * from task where Id=?", [id], callback); }, addTask: function(Task, callback) { return db.query("Insert into task values(?,?,?)", [Task.Id, Task.Title, Task.Status], callback); }, deleteTask: function(id, callback) { return db.query("delete from task where Id=?", [id], callback); }, updateTask: function(id, Task, callback) { return db.query("update task set Title=?,Status=? where Id=?", [Task.Title, Task.Status, id], callback); } }; module.exports = Task; [/code]
تنظیمات Route :
با این وجود که ما مدل های dbconnection و Task را ایجاد کردیم اما بدون تنظیم کردن Route ما قادر به انجام هیچ کاری با این چیزی که ایجاد کرده ایم نیستیم . هر Route یک متد HTTP میباشد که میتواند GET , POST , PUT یا DELETE باشد .
[code language = "javascript"] router.get('/:id?', function(req, res, next) { if (req.params.id) { Task.getTaskById(req.params.id, function(err, rows) { if (err) { res.json(err); } else { res.json(rows); } }); } else { Task.getAllTasks(function(err, rows) { if (err) { res.json(err); } else { res.json(rows); } }); } }); [/code]
حال اجازه دهید که بررسی کنیم چه کاری انجام داده ایم ، ما فقط متد router.get را ایجاد کردیم ، که زمانی که کاربر درخواست HTTP GET را ارسال کند اجرا خواهد شد . فراخوانی متد route.get میتواند با پارامتر یا بدون پارامتر باشد . پارامتر id اختیاری میباشد . ما با اضافه کردن تنها یک "؟" به عنوان پسوند ، آن فیلد را به عنوان Optional تعریف میکنیم . پس ، ابتدا بررسی میکنیم که id اوکی است یا نه . اگر اوکی بود ، سپس ما Task.getTaskById را که در مرحله قبل در Task.js ایجادش کردیم را فراخوانی میکنیم .
[code language = "javascript"] router.post('/', function(req, res, next) { Task.addTask(req.body, function(err, count) { if (err) { res.json(err); } else { res.json(req.body); //or return count for 1 & 0 } }); }); [/code]
زمانی که کاربر درخواستی را برای متد HTTP POST ارسال کند این اجرا خواهد شد . این متد Task.AddTask را فراخوانی خواهد کرد و داده ها را به عنوان پارامتر req.body ارسال خواهد کرد . در صورت موفق بودن insertation یک task object را باز میگرداند و در صورتی که insertation با موفقیت همراه نباشد ، پیام خطایی را باز میگرداند .
مروری بر Task.js :
فایل routing ، باید task.js که بیش تر آن را در فولدر model ایجاد کردیم را ، شامل شود .
[code language = "javascript"] var express = require('express'); var router = express.Router(); var Task = require('../models/Task'); router.get('/:id?', function(req, res, next) { if (req.params.id) { Task.getTaskById(req.params.id, function(err, rows) { if (err) { res.json(err); } else { res.json(rows); } }); } else { Task.getAllTasks(function(err, rows) { if (err) { res.json(err); } else { res.json(rows); } }); } }); router.post('/', function(req, res, next) { Task.addTask(req.body, function(err, count) { if (err) { res.json(err); } else { res.json(req.body); //or return count for 1 & 0 } }); }); router.delete('/:id', function(req, res, next) { Task.deleteTask(req.params.id, function(err, count) { if (err) { res.json(err); } else { res.json(count); } }); }); router.put('/:id', function(req, res, next) { Task.updateTask(req.params.id, req.body, function(err, rows) { if (err) { res.json(err); } else { res.json(rows); } }); }); module.exports = router; [/code]
تنظیمات مربوط app.js :
این قسمت نقطه ی عطف برنامه node.js میباشد . زمانی که کاربر هر متدی درخواست میدهد ، ابتدا این درخواست به App.js هدایت میشود و سپس از app.js به route هدایت خواهد شد . بنابراین ، میتوان گفت که این Configuration file است .
ما باید یکسری چیز ها را در app.js تنظیم کنیم که آنها را در زیر مشاهده میکنید :
• var cors=require('cors');
• var Tasks=require('./routes/Tasks');
• app.use(cors());
• app.use('/Tasks',Tasks);
بعد از اضافه کردن این دستورات به App.js ، فایل app.js َما همانند زیر خواهد شد.
[code language = ”javascript”] var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var cors = require('cors'); var routes = require('./routes/index'); var users = require('./routes/users'); var Tasks = require('./routes/Tasks'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(cors()); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', routes); app.use('/users', users); app.use('/Tasks', Tasks); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; [/code]
کار ما به اتمام رسیده است ، حال به سراغ اجرای RESTful API خود میرویم :
npm start :
جدول زیر خلاصه ای از Routeهایی ست که ما استفاده خواهیم کرد و متدهایی که فراخوانی خواهیم کرد :
برای تست کردن API ما از ابزار REST Client که در مرورگر Mozilla FireFox موجود است استفاده میکنیم .
http://localhost:3000/Tasks
http://localhost:3000/Tasks/1
نتیجه گیری :
ما در این مقاله دیدیم که چگونه با استفاده از Node.js , Express و MySQL یک RESTful API ایجاد کنیم .
- NodeJs
- 4k بازدید
- 3 تشکر