تنظيم نقاط نهاية Express: أفضل ممارسات لفصل ملفات Routes وتحسين الصيانة
في عملية تطوير تطبيق Express الخاص بك، يمكن أن يكون من الأمور الهامة تنظيم ملفات الـ routes بشكل فعال، وفي هذا السياق، يمكنك إنشاء ملف منفصل يحتوي على جميع نقاط نهاية الـ API الخاصة بك. دعونا نقوم بفصل ملف الـ routes وتنظيم الشيفرة:
أولاً وقبل البدء، يمكنك إنشاء مجلد جديد يسمى routes
داخل مجلد src/api
، ونضع فيه ملف الـ routes الخاص بك، وسنسمي هذا الملف routes.js
.
الآن، دعنا نقوم بتعديل ملف الـ server.js
الخاص بك:
javascriptimport path from 'path'
import express from 'express'
import webpack from 'webpack'
import webpackDevMiddleware from 'webpack-dev-middleware'
import webpackConfig from './webpack.config.dev'
const app = express();
// يمكننا استخدام app.use() لتوجيه جميع الطلبات إلى ملف الـ routes الجديد
app.use('/api', require('./src/api/routes/routes'));
app.use(webpackDevMiddleware(webpack(webpackConfig), {
publicPath: webpackConfig.output.publicPath
}));
app.use('/public', express.static(__dirname + '/public'))
app.get('*', function(req, res) {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.listen(3000, 'localhost', function (err) {
if (err) {
console.log(err);
return;
}
});
الآن، دعنا نقوم بتعديل ملف src/api/routes/routes.js
:
javascriptimport express from 'express';
import moviesRouter from './movies'; // نقوم بتوجيه الطلبات ذات الصلة بالأفلام إلى ملف الـ movies
import movieRouter from './movie'; // نقوم بتوجيه الطلبات ذات الصلة بفيلم واحد إلى ملف الـ movie
const router = express.Router();
// يمكنك استخدام app.use() لتحديد نقاط نهاية إضافية حسب الحاجة
router.use('/movies', moviesRouter);
router.use('/movie', movieRouter);
export default router;
الآن، يمكنك رؤية كيف تم تقسيم نقاط نهاية الـ API الخاصة بك بشكل أفضل، حيث يمكنك إضافة مزيد من الملفات وتوجيه الطلبات بسهولة باستخدام app.use()
و router.use()
بشكل فعال ومنظم. هذا النهج يسهل عليك فهم وصيانة التطبيق بشكل أفضل.
المزيد من المعلومات
بالطبع، دعوني أوسع في الشرح حول كيفية تنظيم ملفات الـ routes والتحكم بنقاط نهاية الـ API بشكل أفضل.
-
استخدام ملفات الـ index:
يمكنك استخدام ملفاتindex.js
داخل كل مجلد لتسهيل التصفح وتنظيم الكود. فمثلا، يمكنك إنشاء ملفindex.js
داخل مجلدsrc/api/routes
يقوم بتجميع وتصدير كل ملفات الـ routes الموجودة في المجلد، وهذا يسهل التفاعل مع الكود بشكل أفضل.src/api/routes/index.js
:javascriptimport express from 'express'; import moviesRouter from './movies'; import movieRouter from './movie'; const router = express.Router(); router.use('/movies', moviesRouter); router.use('/movie', movieRouter); export default router;
وبعد ذلك، يمكنك في
server.js
استخدام:javascriptapp.use('/api', require('./src/api/routes'));
-
استخدام middleware مخصص:
يمكنك كذلك إنشاء middleware مخصص يقوم بتحميل وتوجيه ملفات الـ routes بشكل ديناميكي، مما يسهل إضافة مزيد من النقاط النهائية دون الحاجة إلى تعديل ملفserver.js
الخاص بك.src/api/routes/loader.js
:javascriptimport fs from 'fs'; import path from 'path'; import express from 'express'; const router = express.Router(); fs.readdirSync(__dirname).forEach((file) => { if (file !== 'loader.js' && file.endsWith('.js')) { const route = require(`./${file}`); router.use(`/${path.parse(file).name}`, route); } }); export default router;
وفي
server.js
:javascriptapp.use('/api', require('./src/api/routes/loader'));
بهذه الطريقة، يمكنك إضافة ملفات جديدة داخل مجلد
src/api/routes
وستتم إضافتها تلقائياً إلى نقاط النهاية. -
استخدام Express Router في ملفات الـ routes:
يمكنك أيضاً تحسين ملفات الـ routes الخاصة بك باستخدامexpress.Router()
بشكل أفضل لتنظيم الشيفرة وجعلها أكثر قابلية لإعادة الاستخدام والصيانة.src/api/routes/movies.js
:javascriptimport express from 'express'; const router = express.Router(); router.get('/', function(req, res) { res.json({}); }); export default router;
src/api/routes/movie.js
:javascriptimport express from 'express'; const router = express.Router(); router.get('/:id', function(req, res) { // لوجيك الحصول على فيلم بناءً على الـ ID res.json({}); }); export default router;
هذا يجعل كل ملف route يدير نفسه بشكل مستقل ويجعل من السهل فهم وصيانة الكود.