node.js شرح كيفية تضمين معالجات التوجيه في ملفات متعددة في Express؟




node.js شرح (8)

في تطبيق app.js لدي app.js يحتوي على عدد قليل من الطرق الشائعة. ثم في ملف wf.js أود تحديد بضعة مسارات أخرى.

كيف يمكنني الحصول على app.js للتعرف على معالجات wf.js الأخرى المحددة في ملف wf.js ؟

لا يبدو أن يتطلب بسيطة للعمل.


إذا كنت ترغب في وضع المسارات في ملف منفصل ، على سبيل المثال routes.js ، فيمكنك إنشاء ملف routes.js بهذه الطريقة:

module.exports = function(app){

    app.get('/login', function(req, res){
        res.render('login', {
            title: 'Express Login'
        });
    });

    //other routes..
}

ثم يمكنك طلب ذلك من app.js تمرير كائن app بهذه الطريقة:

require('./routes')(app);

ألقِ نظرة أيضًا على هذه الأمثلة

https://github.com/visionmedia/express/tree/master/examples/route-separation


بناء على مثالShadowCloud كنت قادرا على تضمين كل المسارات في دليل فرعي بشكل حيوي.

طرق / index.js

var fs = require('fs');

module.exports = function(app){
    fs.readdirSync(__dirname).forEach(function(file) {
        if (file == "index.js") return;
        var name = file.substr(0, file.indexOf('.'));
        require('./' + name)(app);
    });
}

ثم وضع ملفات الطريق في دليل المسارات مثل:

طرق / test1.js

module.exports = function(app){

    app.get('/test1/', function(req, res){
        //...
    });

    //other routes..
}

تكرار ذلك لعدة مرات كما أحتاج وبعد ذلك أخيرا في وضع app.js

require('./routes')(app);

من المحتمل أن يكون هذا هو السؤال / الإجابة (الإجابات) الأكثر روعة في المكدس. أنا أحب الحلول سام / براد أعلاه. أعتقد أنني كنت أتناغم مع النسخة المتزامنة التي قمت بتطبيقها:

function loadRoutes(folder){
    if (!folder){
        folder = __dirname + '/routes/';
    }

    fs.readdir(folder, function(err, files){
        var l = files.length;
        for (var i = 0; i < l; i++){
            var file = files[i];
            fs.stat(file, function(err, stat){
                if (stat && stat.isDirectory()){
                    loadRoutes(folder + '/' + file + '/');
                } else {
                    var dot = file.lastIndexOf('.');
                    if (file.substr(dot + 1) === 'js'){
                        var name = file.substr(0, dot);

                        // I'm also passing argv here (from optimist)
                        // so that I can easily enable debugging for all
                        // routes.
                        require(folder + name)(app, argv);
                    }
                }
            });
        }
    });
}

هيكل الدليل الخاص بي هو مختلف قليلا. عادة ما أقوم بتعريف المسارات في app.js (في الدليل الجذر للمشروع) عن طريق require './routes' . وبالتالي ، أخطأ في التحقق من index.js لأنني أريد تضمين ذلك أيضًا.

تحرير: يمكنك أيضا وضع هذا في وظيفة واستدعاء المتكرر (أنا تحرير المثال لإظهار هذا) إذا كنت تريد تعشيق الطرق الخاصة بك في مجلدات من عمق عشوائي.


على الرغم من أن هذا السؤال الأكبر سنا تعثرت هنا تبحث عن حل لمسألة مماثلة. بعد تجربة بعض الحلول هنا ، انتهى بي الأمر إلى اتجاه مختلف ، وأعتقد أنني سأضيف الحل لأي شخص آخر ينتهي هنا.

في Express 4.x يمكنك الحصول على مثيل لكائن الموجه واستيراد ملف آخر يحتوي على المزيد من التوجيهات. يمكنك حتى القيام بذلك بشكل متكرر حتى تتمكن مساراتك من استيراد المسارات الأخرى مما يتيح لك إنشاء مسارات عناوين URL سهلة الصيانة. على سبيل المثال ، إذا كان لدي ملف مسار منفصل لنقطة النهاية "للاختبارات" الخاصة بي بالفعل وأريد إضافة مجموعة جديدة من المسارات لـ "/ اختبارات / تلقائية" ، فقد أرغب في تقسيم هذه المسارات "/ الآلية" إلى ملف آخر إلى احتفظ بملفي "/ test" صغيرًا وسهل الإدارة. كما يتيح لك أيضًا تجميع المسارات معًا عن طريق مسار عنوان URL الذي يمكن أن يكون مناسبًا حقًا.

محتويات ./app.js:

var express = require('express'),
    app = express();

var testRoutes = require('./routes/tests');

// Import my test routes into the path '/test'
app.use('/tests', testRoutes);

محتويات ./routes/tests.js

var express = require('express'),
    router = express.Router();

var automatedRoutes = require('./testRoutes/automated');

router
  // Add a binding to handle '/test'
  .get('/', function(){
    // render the /tests view
  })

  // Import my automated routes into the path '/tests/automated'
  // This works because we're already within the '/tests' route so we're simply appending more routes to the '/tests' endpoint
  .use('/automated', automatedRoutes);

module.exports = router;

محتويات ./routes/testRoutes/automated.js:

var express = require('express'),
    router = express.Router();

router
   // Add a binding for '/tests/automated/'
  .get('/', function(){
    // render the /tests/automated view
  })

module.exports = router;

توجيه كامل عودي لكل ملفات .js داخل app.js /routes ، ضع هذا في app.js

// Initialize ALL routes including subfolders
var fs = require('fs');
var path = require('path');

function recursiveRoutes(folderName) {
    fs.readdirSync(folderName).forEach(function(file) {

        var fullName = path.join(folderName, file);
        var stat = fs.lstatSync(fullName);

        if (stat.isDirectory()) {
            recursiveRoutes(fullName);
        } else if (file.toLowerCase().indexOf('.js')) {
            require('./' + fullName)(app);
            console.log("require('" + fullName + "')");
        }
    });
}
recursiveRoutes('routes'); // Initialize it

في /routes التي تضع فيها whatevername.js وتهيئة مساراتك مثل هذا:

module.exports = function(app) {
    app.get('/', function(req, res) {
        res.render('index', { title: 'index' });
    });

    app.get('/contactus', function(req, res) {
        res.render('contactus', { title: 'contactus' });
    });
}

أعلم أن هذا سؤال قديم ، لكنني كنت أحاول معرفة شيء مثل نفسي ، وهذا هو المكان الذي انتهى به الأمر ، لذا أردت أن أضع حلا لمشكلة مماثلة في حال كان لدى شخص آخر نفس القضايا التي أواجهها. م بعد. هناك وحدة عقدة لطيفة هناك دعا consign الذي يفعل الكثير من الاشياء نظام الملفات التي ينظر إليها هنا بالنسبة لك (أي - لا يوجد مادة readdirSync). فمثلا:

لدي تطبيق واجهة برمجة تطبيقات مريح أحاول إنشاءه وأرغب في وضع جميع الطلبات التي تنتقل إلى "/ api / *" للتحقق من صحتها ، وأريد تخزين جميع مساراتي التي تدخل في واجهة برمجة التطبيقات إلى الدليل الخاص بها (دعونا نسميها "api"). في الجزء الرئيسي من التطبيق:

app.use('/api', [authenticationMiddlewareFunction], require('./routes/api'));

داخل دليل المسارات ، لدي دليل يسمى "api" وملف يدعى api.js. في api.js ، لدي ببساطة:

var express = require('express');
var router = express.Router();
var consign = require('consign');

// get all routes inside the api directory and attach them to the api router
// all of these routes should be behind authorization
consign({cwd: 'routes'})
  .include('api')
  .into(router);

module.exports = router;

كل شيء يعمل كما هو متوقع. أمل أن هذا يساعد شخصاما.


وبناءًا على الإجابة السابقة ، ستتجاهل هذه النسخة من المسارات / index.js أي ملفات لا تنتهي بـ .js (ونفسها)

var fs = require('fs');

module.exports = function(app) {
    fs.readdirSync(__dirname).forEach(function(file) {
        if (file === "index.js" || file.substr(file.lastIndexOf('.') + 1) !== 'js')
            return;
        var name = file.substr(0, file.indexOf('.'));
        require('./' + name)(app);
    });
}







express