ساخت یک REST API مبتنی بر NodeJS برای انجام عملیات های CRUD در MongoDB

پنجشنبه 14 اردیبهشت 1396

در این مقاله نحوه ساخت یک REST API که عملیات هایCRUD را روی MongoDB انجام دهد، آموزش داده خواهد شد. برای ساخت این REST API از ExpressJS و NodeJS استفاده می شود.

ساخت یک REST API مبتنی بر NodeJS برای انجام عملیات های  CRUD در MongoDB

Node.js یکی از بهترین پلتفرم ها برای ساخت بخش back-end برنامه ها است. مهم نیست که مثلا برنامه برای ios بنویسید یا که برنامه تون یک وب سایت Single Page باشه که با انگولار پیاده سازی شده، برنامه شما در هر حال دارای بخش back-end  خواهد بود. معمولا در بخش back-end عملیات های مربوط به دیتابیس، احراز هویت، تعیین سطح دسترسی، لاگ گیری و غیره انجام می شود. احتمالا عبارت MEAN به گوشتان خورده این عبارت در واقع مخفف MongoDB، Express JS، Angular و Node.js است.

در صورتی که به یادگیری اصولی و حرفه ای این تکنولوژی قدرتمند علاقمند هستید میتوانید دوره کامل و جامع آموزش Node Js موجود در سایت تاپ لرن را مشاهده کنید .



در مجموعه MEAN شما بخش back-end برنامه را به کمک MongoDB، Express JS، Angular و Node.js می سازید. در این مقاله نحوه ساخت یک REST API  که عملیات هایCRUD  را روی MongoDB انجام دهد، آموزش داده خواهد شد. برای ساخت این REST API از ExpressJS و NodeJS استفاده می شود.

در اینجا به ساخت یک REST API می پردازیم که توانایی انجام عملیات های CRUD را داشته باشد.
در سمت کاربر، شما از متدهایی استفاده می کنید مثل GET، POST، PUT و DELETE تا عملیات های CRUD را انجام دهید. بنابراین، شما برای ساخت یک رکورد باید به کمک HTTP POST اطلاعات را منتقل کنید و این اطلاعات در بدنه HTTP request شما قرار خواهد گرفت.

نصب و راه اندازی

نرم افزار های زیر را در کامپیوتر خود نصب کنید.

MongoDB

NodeJS

برای پیکربندی MongoDB بعد از نصب آن، مطمعن شوید که حتما فولدری با نام data\db در درایو اصلی سیستم شما (یعنی درایوی که os روی آن نصب است) وجود داشته باشد، چراکه MongoDB به صورت پیشفرض با این فولدر کار می کند. برنامه MongoDB را به کمک دستور Mongod.exe اجرا کنید. که در تصویر زیر نحوه اجرای برنامه نمایش داده شده است.

 

بعد از اینکه نصب با موفقیت انجام شد، یک فولدر خالی در محل پروژه بسازید و یک نام مناسب برای آن انتخاب کنید، ما نام فولدر را Project قرار داده ایم.

مرحله 1 – نصب وابستگی ها

در فولدر پروژه یک فایل با نام package.json اضافه می کنیم و با استفاده از nmp (Node Package Manager) وابستگی های مورد نیاز را نصب می کنیم. Nmp اطلاعات فایل package.json را می خواند تا وابستگی ها را در پروژه نصب کند، کد زیر را در فایل package.json اضافه کنید.

{  
    "name": "product-api",  
    "main": "server.js",  
    "dependencies": {  
        "express": "~4.0.0",  
        "body-parser": "~1.0.1",  
        "cors": "2.8.1",  
        "mongoose": "~3.6.13"  
    }  
} 

در این قطعه کد وابستگی هایی که مورد نیاز پروژه است را ذکر کرده ایم تا این وابستگی ها به پروژه اضافه شود.

 Express JSبرای ساخت API route ها

Body parser برای تجزیه مقادیر JSON که از طرف کاربر فرستاده می شود

CORS برای فعال کردن به اشتراک گذاری منابع در API

Monogoose برای کار کردن با MongoDB در داخل NodeJS

بعد از آپدیت شدن package.json با کدهای بالا، command prompt را باز کنید و دستور npm install را اجرا کنید. البته قبل از انجام اینکار حتما باید NodeJS روی سیستم شما نصب باشد، اگر نصب نبود حتما آنرا نصب کنید.

بعد از اینکه دستور npm install با موفقیت اجرا شد، فولدر node_modules در پروژه شما اضافه می شود که شامل تمامی وابستگی های مورد نیاز برای ساخت REST API در NodeJS است تا بتوانیم عملیات های CRUD را روی MongoDB انجام دهیم.

مرحله 2 – ساخت Model

وقتی شما در حال کار با یک RDBMS مثل SQL Server یا MySQL هستید، باید یک model بسازید تا بتوانید عملیات های CRUD را روی یک table به خصوص انجام دهد.  MongoDB در واقع یک دیتابیس مبتنی بر سند است که شما قابلیت افزودن، حذف، ویرایش و خواندن اطلاعات این سند را خواهید داشت. MongoDB شما را محدود به ساخت یک model با شرایط ثابت نمی کند. اگرچه برای کار با mongoose شما به یک model نیاز خواهید داشت. پس یک model برای انجام عملیات های CRUD می سازیم. در این پروژه یک فایل با نام product.js اضافه می کنیم و یک مدل با نام Product را همانگونه که در زیر نمایش داده شده است در داخل این فایل قرار می دهیم.

    var mongoose = require('mongoose');  
    var Schema = mongoose.Schema;  
    var ProductSchema = new Schema({  
        title: String,  
        price: Number,  
        instock: Boolean,  
        photo: String,  
    });  
    module.exports = mongoose.model('Product', ProductSchema);   

همانطور که در بالا مشخص است، Product دارای چهار خصوصیت با دیتا تایپ های متفاوت است.

مرحله 3- ساخت سرور

در این مرحله یک سرور برای REST API می سازیم. برای ساخت سرور یک فایل با نام server.js به پروژه اضافه می کنیم. اگر فایل package.json را بررسی کنیم می بینیم که server.js  به عنوان مقدار main آن قرار داده شده است پس سرور دنبال فایل server.js می گردد تا سرور را راه اندازی کند. باید فایل های لازم برای استارت را در آن قرار دهیم.

برای استارت باید کدهای زیر را به فایل server.js اضافه کنید.

var express = require('express');  
var bodyParser = require('body-parser');  
var cors = require('cors');  
var app = express();  
var mongoose = require('mongoose');  
var product = require('./product');  

بعد از انتقال تمامی ماژول ها به سرور حالا وقت ساخت مسیر، اختصاص دادن پورت و استفاده از  bodyParserبرای تجزیه مقادیر JSON ورودی است که کدهای آنها را در پایین می بینید و باید کد زیر را به آخر فایل server.js اضافه کنید.

app.use(bodyParser.urlencoded({ extended: true }));  
app.use(bodyParser.json());  
var port = process.env.PORT || 8090;  
var router = express.Router(); 

در تکه کد بالا، در واقع ما یک پورت به سرور اختصاص دادیم و یک مسیر برای آن ساختیم. بعد از این کدها باید تکه کد زیر را به آخر فایل server.js اضافه کنید.

app.use(cors());  
app.use('/api', router);  
app.listen(port);  
console.log('REST API is runnning at ' + port);  

در قطعه کد بالا قابلیت پشتیبانی CORS را فعال می کنیم و پورت API را پیکربندی می کنیم و همچنین تنظیم می کنیم که REST API در آدرس baseurl/api/{routename} ساخته شود. در پایان این مرحله فایل Server.js باید به شکل زیر باشد.

Server.js 

    var express = require('express');  
    var bodyParser = require('body-parser');  
    var cors = require('cors');  
    var app = express();  
    var mongoose = require('mongoose');  
    var product = require('./product');  
      
    app.use(bodyParser.urlencoded({ extended: true }));  
    app.use(bodyParser.json());  
    var port = process.env.PORT || 8090;  
    var router = express.Router();  
      
      
    // all other code will go here   
      
      
    app.use(cors());  
    app.use('/api', router);  
    app.listen(port);  
    console.log('REST API is runnning at ' + port);   

مرحله 4- اتصال به سرور MongoDB

در این مرحله برنامه را به سرور دیتابیس MongoDB متصل می کنیم. برای انجام اینکار بعد از کد ساخت router یا همان قسمتی که در بالا به صورت کامنت all codes goes here نوشته شده است، قطعه کد زیر را اضافه کنید:

    mongoose.connect('mongodb://localhost:27017/products');  

شما در حال وصل شدن به دیتابیس product در داخل سرور MongoDB هستید، به صورت پیشفرض MongoDB روی پورت 27017 اجرا می شود.

نکته

در این بخش شما باید مطمعن شوید که برنامه روی همین پورت اجرا می شود، در غیر اینصورت شما موقع اجرای API به ارور برخورد خواهید کرد. در ویندوز، دستور server- navigate در command prompt بزنید و به آدرس c:\program files\mongodb\server\3.4\bin بروید و سپس mongod.exe را اجرا کنید. این دستور سرور MongoDB را راه اندازی می کند.

مرحله 5- ساخت مسیر میانی

می توانیم یک مسیر بسازیم که قبل از بقیه مسیر ها فراخوانی شود. در این مسیر شما می توانید عملیات های متنوعی مانند احراز هویت، تعیین سطح دسترسی و لاگ گیری را انجام دهید.

در داخل Express JS شما می توانید این مسیر را به راحتی بسازید، اینکار را می توان با اضافه کردن use route به شکلی در زیر نمایش داده شده است، انجام داد.

    router.use(function (req, res, next) {  
        // do logging   
        // do authentication   
        console.log('Logging of request will be done here');  
        next(); // make sure we go to the next routes and don't stop here  
    });   

حتما قطعه کد بالا را بعد از کدهایی که در مرحله 4 گفته شد، به server.js اضافه کنید

مرحله 6- ساخت رکورد

برای ساخت یک رکورد یا وارد کردن یک سند جدید، شما باید یک مسیر برای عملیات POST بسازید. در داخل REST API یک قراردادی وجود دارد که وقتی یک کاربر یک عملیات POST انجام می دهد، یک رکورد جدید ساخته می شود. پس یک مسیر برای عملیات POST می سازیم. برای ساخت این مسیر کافیه کد زیر را به بعد از قطعه کد use route که در بالا گفته شد اضافه کنید.

router.route('/products').post(function (req, res) {     
});  

مسیری که در بالا ساخته شد مواقعی فراخوانی می شود که یک کاربر عملیات HTTP POST را در آدرس baseurl/api/products انجام دهد.

بعد باید برای اضافه کردن داده ها به دیتابیس کد بنویسیم، برای انجام اینکار باید دو کار زیر را انجام دهیم

1- یک model را با کمک request body بسازیم. که این کار را در مرحله 2 انجام داده بودیم.

2- فراخوانی تابع ذخیره، تا رکورد را در داخل دیتابیس ذخیره کند.

برای انجام فعالیت های بالا، باید مسیر POST را مطابق قطعه کد زیر ویرایش کنیم.

    router.route('/products').post(function (req, res) {  
        var p = new product();  
        p.title = req.body.title;  
        p.price = req.body.price;  
        p.instock = req.body.instock;  
        p.photo = req.body.photo;  
        p.save(function (err) {  
            if (err) {  
                res.send(err);  
            }  
            res.send({ message: 'Product Created !' })  
        })  
    });   

اجرا و تست

برای تست ساخته شدن API، دستور زیر را اجرا کنید.



در این لحظه API روی پورت 8090 اجرا شود. برای تست API کافیه که POSTMAN را باز کنید و عملیات POST را در آدرس baseurl/api/products انجام دهید.



در کنار تظیمات بالا که در داخل Headers است، یک content-type در آدرس application/json اضافه می شود. وقتی که شما روی دکمه ارسال کلیک کنید، اگر همه چی مطابق انتظار پیش بره، یک نتیجه از API دریافت می کنیم که در تصویر زیر می توانید مشاهده کنید.

با توجه به اینکه در مرحله قبلی به دیتابیس products وصل شدیم، پس هر گونه عملیاتی انجام دهیم تغییرات آن در این دیتابیس اعمال خواهد شد.

مرحله 7- دریافت رکوردها

برای دریافت رکوردها باید یک عملیات GET انجام شود، پس یک مسیر برای عملیات get به API اضافه می کنیم. مسیر get را می توان به کمک کد های زیر به برنامه اضافه کرد.

    router.route('/products').get(function (req, res) {  
        product.find(function (err, products) {  
            if (err) {  
                res.send(err);  
            }  
            res.send(products);  
        });  
    });   

در قطعه کد بالا از mongoose استفاده شده و با کمک تابع find می توان تمامی رکوردهای MongoDB را دریافت کرد.

مسیر بالا وقتی فراخوانی می شود که یک کاربر عملیات HTTP GET را در آدرس baseurl/api/products انجام بدهد. برای تست API کافیه که POSTMAN را باز کرده و یک عملیات GET در آدرس baseurl/api/products انجام دهیم.



در داخل Postman متوجه می شویم که عملیات HTTP GET تمامی رکورد ها را در خروجی نمایش می دهد. برای نمایش یک رکورد خاص بر اساس فیلد product_id باید یک مسیر به API اضافه کنیم که وقتی کاربر عملیات get را به همراه پارامتر product_id انجام داد، فقط اطلاعات یک محصول در خروجی نمایش داده شود.

    router.route('/products/:product_id').get(function (req, res) {  
      
        product.findById(req.params.product_id, function (err, prod) {  
            if (err)  
                res.send(err);  
            res.json(prod);  
        });  
    });   

برای دریافت اطلاعات یک محصول خاص از mongoose استفاده می کنیم و به کمک تابع findById که product_id را به عنوان ورودی دریافت می کند، محصول مورد نظر پیدا می شود. برای خواندن مقدار پارامتر ورودی که از طریق عملیات HTTP GET دریافت می شود باید از req.params استفاده کنیم.

مسیر بالا وقتی فراخوانی می شود که کاربر یک عملیات HTTP GET در آدرس baseurl/api/products/{product_id} انجام دهد. برای تست API کافیه که POSTMAN را باز کرده و یک عملیات GET در آدرس baseurl/api/products/{product_id} انجام دهیم.



یک محصول که متناسب با پارامتر ورودی یعنی product_id باشد در خروجی نمایش داده می شود.

مرحله 8 – ویرایش رکورد ها

برای ویرایش رکوردها به یک عملیات HTTP PUT نیاز است. وقتی که عملیات PUT انجام می شود کارهای زیر انجام می شود.

1- مقدار product_id محصولی که قرار است ویرایش شود به عنوان یک پارامتر فرستاده می شود.

2- شی product که قرار ویرایش شود به عنوان یک request body ارسال می شود.

برای انجام عملیات PUT باید یک مسیر هم برای PUT ساخته شود که کدهای آن را در زیر مشاهده می کنید.

    router.route('/products/:product_id').put(function (req, res) {  
      
        product.findById(req.params.product_id, function (err, prod) {  
            if (err) {  
                res.send(err);  
            }  
            prod.title = req.body.title;  
            prod.price = req.body.price;  
            prod.instock = req.body.instock;  
            prod.photo = req.body.photo;  
            prod.save(function (err) {  
                if (err)  
                    res.send(err);  
      
                res.json({ message: 'Product updated!' });  
            });  
      
        });  
    });   

عملیات هایی که برای انجام عمل ویرایش لازم هستند :

1- دریافت محصولی که قرار است ویرایش شود از مجموعه محصولات.

2- تغییرات و ویرایش های مورد نیاز روی محصول دریافتی انجام شود.

3- محصول ویرایش شده در داخل دیتابیس ذخیره شود.

مسیر بالا که برای ویرایش یک محصول خاص است، وقتی فراخوانی می شود که کاربر عملیات HTTP PUT را در آدرس baseurl/api/products/{product_id} انجام دهد. برای تست API کافیه که POSTMAN را باز کنیم و عملیات PUT را در آدرس baseurl/api/products/{product_id} انجام دهیم. اطلاعات محصولی که قرار است ویرایش شود باید به صورت body request فرستاده شود که در تصویر زیر نشان داده شده است.

مرحله 9 – حذف یک رکورد

برای حذف یک رکورد خاص، کاربر باید عملیات HTTP DELETE را انجام دهد. پس باید یک مسیر برای عملیات delete بسازیم.

router.route('/products/:product_id').delete(function (req, res) {  
  
    product.remove({ _id: req.param.product_id }, function (err, prod) {  
        if (err) {  
            res.send(err);  
        }  
        res.json({ message: 'Successfully deleted' });  
    })  
  
});  

کاربر  product_id محصولی که قرار است حذف شود را به صورت پارامتر ارسال می کند.

مسیر بالا برای حذف یک محصول خاص است که وقتی فراخوانی می شود که کاربر عملیات HTTP DELETE را در آدرس baseurl/api/products/{product_id} انجام دهد. برای تست API کافیه که POSTMAN را باز کرده و عملیات DELETE را در آدرس baseurl/api/products/{product_id} انجام دهیم، همانطور که در شکل زیر نمایش داده شده است.



در این مقاله یک REST API کامل طراحی شد که توانایی انجام عملیات های CRUD  به وسلیه NodeJS را روی MongoDB دارد.

آموزش mongodb

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • NodeJs
  • 4k بازدید
  • 5 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید