اذهب إلى المحتوى

السؤال

نشر

أعمل على مشروع من خلال إطار العمل express.js و node.js وأحاول تقسيم الشيفرة البرمجية إلى عدة ملفات بدلاً من تجميعها في ملف واحد باتباع بنية شبيهة بال MVC، فقمت بوضع الكود التالي ضمن الملف الرئيسي server.js

var express   = require('express');
var app       = express.createServer();
var routes    = require('./routes');

var controllers = require('./controllers');
routes.setup(app, controllers);

app.listen(5000, function() {
  console.log('listening on port 5000');
});

وبعدها قمت بإنشاء ملفات المسارات كالتالي:

exports.setup = function(app, controllers) {
  app.get('/', controllers.index);
  app.post('/user', controllers.users.index);
  app.post('/posts/:post', controllers.posts.create);
   ...

};

ولكن كيف يمكنني مشاركة المتغيّر app الموجود في الملف الرئيسي مع المتحكّم المطلوب؟ أي هل يجب أن أقوم بإعادة تضمينه من خلال require أو يجب أن أقوم بتمريره إلى ملف المسارات وبعدها إلى المتحكّم؟ وفي حال نعم كيف يمكنني إجراء هذا التمرير؟

Recommended Posts

  • 1
نشر

بما أنك تستخدم إطار العمل express، يمكنك الحصول على محتوى app من خلال req.app التي يتم تضمينها مع كل طلب. بحيث يتم إضافة أي بيانات إضافية من خلال app.set:

app.set('anykey', {})

والحصول عليها ضمن الكود يكون من خلال المتغير req الذي سيكون موجود مع كل طلب يتم ربطه بالمتحكّم الخاص به بالشكل التالي:

req.app.get('anykey')

كما يمكنك تعديل كود الملف الرئيسي لديك وجعل app متغيّر عام بهذا الشكل:

var app = module.exports = express();

app.use(app.router);

وعندها يمكنك تضمين app في الأجزاء المتفرقة من الكود لديك كالتالي:

var app = require('../app');

app.get('/', function(req, res, next) {
  res.render('index');
});

وبشكل مشابه يمكنك بباسطة تمرير المتغيرات إلى المتحكمات لديك بهذا الشكل:

var controllers = require('./controllers')({app: app});

وإنشاء واجهة عامة للمتحكمات تستقبل هذه المتغيرات:

// controllers.js

module.exports = function(params)
{
    return require('controllers/index')(params);
}

ثم الوصول إليها يكون بهذا الشكل:

// controllers/index.js

function controllers(params)
{
  var app = params.app;

  controllers.users = require('./users');

  controllers.index = function(req, res) {
    ...
  };
}

module.exports = controllers;

ويمكنك الإطلاع على طريقة مشابهة من خلال استخدام locals في node.js موجودة هنا:

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...