إنشاء api بسيط local لتطبيق note باستخدام nodeJS
في هذه المقال سوف نقوم بعمل معكم تطبيق note بسيط يكون local على الجهاز بمعنى لن نحتاج لقاعدة بيانات حتى نعمل عليها فالامر بسيط جدا كل هذا سوف يكون من خلال الاكواد التي نقدمها لكم في هذه المقاله وسوف يكون api نقوم بعمله معكم حتى تكون قادر على بناء تطبيقات apis بسهوله , الفكرة نفسها ولن يختلف فقط في بعض الامور البسيطه جدا والتي سوف نشاركها معكم في الدروس القادمه كيف تتعامل مع sql وايضا كيفية التعامل مع mongoDB حتى تقوم ببناء قاعدة بيانات متكامله .
المكتبات التي سوف نحتاجها اليوم
memorystorage : لتخزين البيانات في الذاكرة المحليه
sequential-ids : لتوليد ارقام بنمط معين بشكل مرتب
تهيئة ملفات المشروع لبدء انشاء note api
هذا الترتيب الذي سوف تمشي عليه حتى تقوم ببناء api سهل التعديل عليه مستقبلا .
الاكواد المستعمله لبناء api بشكل ناجح
تاكد انك تستعمل في الكود الخاص بك في صفحة main لانه لم يتم ارفاقه بالصورة ويتوفر بالكود الموجود بالاسفل .
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json());
كود api باستخدام local storage وانشاء api
هذه الاكواد الخاصه بالملفات التي نقدمها لكم بالاعلى يمكنك نسخ الاكواد وانشاء الملفات الخاصه بها ولكن في ملف test سوف يكون هناك بعض التعديلات كما هو موجوده بالاعلى حتى تتمكن من الحصول على البيانات من api الى التطبيق الخاص بك .
app.js
// ------------ test.js (main file) ------------ //
var express = require('express')
var cors = require('cors')
var bodyParser = require('body-parser')
var noteRoute = require('./route/route')
var app = express()
app.use(cors())
// get data req from postman or any platform to test api
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json());
app.get('/', function (req, res) {
res.send('sarver is loaded')
});
app.use('/api/v1',noteRoute)
app.listen(3000, function () {
console.log('sarver is loaded')
})
// ------------ generator.js ------------ //
var sequential = require("sequential-ids");
// generate numbers by order sort
var generator = new sequential.Generator({
digits: 3,
// format
restore: "000"
});
generator.start();
module.exports = generator
// ------------ memorystorage.js ------------ //
var MemoryStorage = require('memorystorage');
var myStorage = new MemoryStorage('note-app');
exports.getKeys = (myStorage) => {
var keys = [];
for (var i=0; i<myStorage.length; i++) {
keys.push(myStorage.key(i))
}
return keys;
}
exports.getValus = (myStorage) => {
var valus = [];
for (var i=0; i<myStorage.length; i++) {
var key = myStorage.key(i);
valus.push(myStorage.getItem(key))
}
return valus;
}
exports.myStorage = myStorage;
// ------------ note_model.js ------------ //
exports.Note = class Note {
constructor(id,title,body,created_by,created_at,) {
this.id = id;
this.title = title;
this.body = body;
this.created_by = created_by;
this.created_at = created_at;
}
}
// ------------ controller.js ------------ //
var generator = require('../utils/generator')
var memorystorage = require('../utils/memorystorage')
var model = require('../models/note_model')
exports.getAllNote = (req,res)=> {
var note_id = generator.generate();
memorystorage.myStorage.setItem(note_id,"first");
var note_id2 = generator.generate();
memorystorage.myStorage.setItem(note_id2,"socond");
var keys = memorystorage.getKeys(memorystorage.myStorage)
var valus = memorystorage.getValus(memorystorage.myStorage)
console.log('values ------------------- ' + JSON.stringify(valus))
console.log('values ------------------- ' + JSON.stringify(keys))
var Note = model.Note;
var noteObj = new Note(note_id,'ahmed','ahmed body' , 'ahmed' , new Date());
res.send('get all notes ----- ' + JSON.stringify(noteObj));
}
exports.sendNote = (req,res)=> {
res.send('sendNote ----- ');
}
exports.updateNote = (req,res)=> {
res.send('updateNote ----- ');
}
exports.deleteNote = (req,res)=> {
res.send('deleteNote ----- ');
}
// ------------ route.js ------------ //
var express = require('express');
const router = express.Router();
var cntroller = require('../controller/controller')
router.get('/get-notes',cntroller.getAllNote)
router.get('/send-note',cntroller.sendNote)
router.get('/update-note',cntroller.updateNote)
router.get('/delete-note',cntroller.deleteNote)
module.exports = router
كيفية إضافة بيانات على السيرفر في note api بواسطة nodeJS
في البداية سوف نقوم بتعديل بعض ال requests في routs
router.get('/get-notes',cntroller.getAllNote)
router.post('/send-note',cntroller.sendNote)
router.put('/update-note',cntroller.updateNote)
router.delete('/delete-note',cntroller.deleteNote)
ناتي الان الى اول خاصية وهيا اضافة عنصر باستخدام api كما اخبرناكم انه في ثاني صورة الكود الخاص بي bodyParser يجب ان يكون لديكم حتى لا يحدث مشاكل معك اثناء عملية اضافة العناصر في تطبيقك .
add.js
exports.sendNote = (req,res)=> {
var seqId = generator.generate();
var createdBy = "admin";
var createdOn = new Date();
try {
var title = req.body.title;
var content = req.body.content;
if(!title || !content){
console.log(content);
console.log(title);
return res.status(500).send({ error: 'Title and Content should not be empty' })
}
var Note = model.Note;
var noteObj = new Note(seqId , title , content , createdBy , createdOn);
memorystorage.myStorage.setItem(seqId , noteObj);
console.log(title);
console.log(content);
return res.status(201).send("Successfully note saved ");
} catch (e) {
return res.status(500).send({ error: 'Error' })
}
}
كيفية عرض البيانات من السيرفر باستخدام nodeIS
الان ناتي الى مسالة الحصول على جميع العناصر وبها انتقلنا الى ذاكرة التخزين المؤقت التي قمنا بها وحصلنا على ال key الذي يحمل البيانات وبعدها قمنا بعرضه واذا لم يكن هناك بيانات سوف نعرض رساله توضح للمستخدم انه لا يوجد بيانات او عناصر في هذا القسم .
get_data.js
exports.getAllNote = (req,res)=> {
var values = memorystorage.getValus(memorystorage.myStorage);
if (values.length <= 0) {
return res.status(505).send("You have no items yet is here");
}
console.log("Values ....... " + JSON.stringify(values));
return res.status(200).send(JSON.stringify(values));
}
كيفية التعديل على احد عناصر api بواسطة js
الان في عملية تحديث البيانات لا تختلف كثيرا عن عملية اضافة بيانات فهي نفس العملية السابقه ولكن هنا نقوم بتعديل بيانات المستخدم فقط دون اضافتها من البداية .
update.js
exports.updateNote = (req,res)=> {
var createdBy = "admin";
var createdOn = new Date();
var noteId = req.body.noteId;
var title = req.body.title;
var body = req.body.body;
if(!noteId){
return res.status(500).send({ error: 'noteId should not be empty' })
}
if(!title || !body){
return res.status(500).send({ error: 'Title and Content should not be empty' })
}
var noteItem = memorystorage.myStorage.getItem(noteId);
if(!noteItem){
return res.status(500).send({ error: 'noteId is not exist' })
}
var Note = model.Note;
var noteObj = new Note(noteId , title , body , createdBy , createdOn);
memorystorage.myStorage.setItem(noteId , noteObj);
return res.status(200).send("Successfully note updated ");
}
كيفية حذف عنصر من api بواسطة nodeIS
سوف نحتاج الى تغيير بسيط في route في جزء الحذف سوف نضع الكود التالي
router.delete('/delete-note/:noteId',cntroller.deleteNote)
حتى نجرب طريقة اخرى في التعامل مع البيانات وهنا سوف نحذف البيانات عن طريق وضع رقم العنصر في العنوان .
delete.js
exports.deleteNote = (req,res)=> {
var noteId = req.params.noteId;
// validate not empty
if(!noteId){
return res.status(500).send({ error: 'can not delete empty noteId' })
}
// validate is already exists
var noteItem = memorystorage.myStorage.getItem(noteId);
if(!noteItem){
return res.status(500).send({ error: 'noteId is not exist' })
}
// is exits
memorystorage.myStorage.removeItem(noteId);
return res.status(200).send("Successfully note deleted ");
}