ایجاد Web API با استفاده از Node.js و MySQL

در این مقاله ، به بررسی چگونگی ایجاد یک RESTful API ساده با استفاده از node.js و MySQL به عنوان پایگاه داده خواهیم پرداخت . و در ادامه ی مقاله مثالی را ارائه خواهیم داد و بصورت مرحله به مرحله به بررسی آن خواهیم پرداخت .

ایجاد Web 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 ایجاد کنیم . 

دانلود نسخه ی PDF این مطلب