এক্সপ্রেসে একাধিক ফাইলে রুট হ্যান্ডলারগুলি কীভাবে অন্তর্ভুক্ত করবেন?


222

আমার নোডজেএস expressঅ্যাপ্লিকেশনটিতে আমার কাছে app.jsকয়েকটি প্রচলিত রুট রয়েছে। তারপরে একটি wf.jsফাইলে আমি আরও কয়েকটি রুট সংজ্ঞায়িত করতে চাই।

আমি কীভাবে ফাইলে app.jsসংজ্ঞায়িত অন্যান্য রুট হ্যান্ডলারগুলি চিনতে পারি wf.js?

একটি সহজ প্রয়োজন কাজ করে বলে মনে হচ্ছে না।


2
এই উত্তরটি পরীক্ষা stackoverflow.com/a/38718561/1153703
Bikesh এম

উত্তর:


399

আপনি যদি রুটগুলি একটি পৃথক ফাইলে রাখতে চান , উদাহরণস্বরূপ 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


18
: আসলে, লেখক (জে Holowaychuck) একটি ভাল approche দেয় vimeo.com/56166857
avetisk

একাধিক ফাইলের জন্য রাউটিং ইস্যু সমাধান করে, তবে অ্যাপ্লিকেশনগুলিতে সংজ্ঞায়িত ফাংশনগুলি রুটে অ্যাক্সেসযোগ্য নয়।
এক্সআইএমআরএক্স

5
আপনার যদি কিছু ফাংশন প্রয়োজন হয় তবে এগুলি কেবল অন্য মডিউল / ফাইলে রাখুন এবং অ্যাপ্লিকেশন এবং রুট.জেএস উভয় থেকেই এটি প্রয়োজন
বিফিল

2
আমি শুনতে সমস্ত কিছু বুঝতে পেরেছি তবে এটির প্রয়োজন হয়েছে ('./ রুটস') (অ্যাপ্লিকেশন) এই সিনটেক্সটি আমার মনকে আঘাত করে, যে কেউ আমাকে বলতে পারবেন এটি ঠিক কী, বা যতক্ষণ পর্যন্ত আমি এর পাসিং অ্যাপ্লিকেশন "অ্যাপ" জানি না এর ব্যবহার কী?
এএনঞ্জা

6
নীচে এই প্রশ্নের আরও ভাল উত্তর আছে - stackoverflow.com/a/37309212/297939
দিমিত্রি

124

যদিও এটি একটি পুরানো প্রশ্ন আমি এখানে কোনও অনুরূপ সমস্যার সমাধানের সন্ধানে হোঁচট খেয়েছি। এখানে কয়েকটি সমাধানের চেষ্টা করার পরে আমি অন্য দিকে যেতে শুরু করেছিলাম এবং ভেবেছিলাম যে এখানে যে কেউ শেষ হয় তার জন্য আমি আমার সমাধান যোগ করব।

এক্সপ্রেস 4.x এ আপনি রাউটার অবজেক্টের উদাহরণ পেতে পারেন এবং আরও একটি রুট যুক্ত অন্য ফাইলটি আমদানি করতে পারেন। এমনকি আপনি এটি পুনরাবৃত্তভাবে করতে পারেন যাতে আপনার রুটগুলি অন্য ইউরোপগুলি আমদানি করে যাতে আপনাকে ইউআরএল পাথগুলি বজায় রাখতে সহজতর করে তোলে। উদাহরণস্বরূপ, যদি আমার ইতিমধ্যে আমার '/ পরীক্ষাগুলি' শেষের পয়েন্টের জন্য পৃথক রুট ফাইল থাকে এবং '/ পরীক্ষা / স্বয়ংক্রিয়' এর জন্য আমি একটি নতুন সেট রুট যুক্ত করতে চাই তবে আমি এই '/ স্বয়ংক্রিয়' রুটগুলিকে অন্য কোনও ফাইলের মধ্যে ভেঙে ফেলতে চাইতে পারি আমার '/ পরীক্ষা' ফাইলটি ছোট এবং পরিচালনা করা সহজ রাখুন। এটি আপনাকে যুক্তিযুক্তভাবে ইউআরএল পাথের সাথে একসাথে রুটগুলি গোষ্ঠী করতে দেয় যা সত্যই সুবিধাজনক হতে পারে।

./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;

2
এই এক সেরা উত্তর, তালিকার শীর্ষে থাকা উচিত! আপনাকে ধন্যবাদ
Kostanos

আমি এই কাঠামোটি নোড জেস রেস্ট এপিআই এর জন্য ব্যবহার করতে পারি?
এমএসএম

@ এমএমসুরুগান হ্যাঁ আপনি এই প্যাটার্নটির সাহায্যে বিশ্রাম এপিআই তৈরি করতে পারেন।
শর্টআরউন্ড 1911

@ শর্টআরউন্ড 1911 আমি এই প্যাটার্নটিতে একটি বিশ্রাম এপিআই তৈরি করছি এবং প্লেস্ক হোস্টিং সার্ভারে রেখেছি, আমি একটি ত্রুটি পাচ্ছি
এমএসএম

96

@ শ্যাডক্লাউডের উদাহরণে বিল্ডিং আমি একটি সাব ডিরেক্টরিতে সমস্ত রুটকে গতিশীলরূপে অন্তর্ভুক্ত করতে সক্ষম হয়েছি।

যাত্রাপথ / 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);

1
আমি এই পদ্ধতির আরও ভাল পছন্দ করি, মূল অ্যাপ্লিকেশন ফাইলে নির্দিষ্ট কিছু যুক্ত না করেই নতুন রুট যুক্ত করার অনুমতি দেয়।
জেসন মিজিওনসেকিজ

3
ভাল, আমি swp ফাইলগুলির সাথে সমস্যার মুখোমুখি হওয়ায় ফাইল এক্সটেনশনের অতিরিক্ত চেক সহ আমিও এই পদ্ধতির ব্যবহার করি ।
গীকফিশ

আপনার রিডডিরসিঙ্ক ডাব্লু / এটি ব্যবহার করতে হবে না, রিডডির ভাল কাজ করে।
পল

5
ডিরেক্টরিতে ফাইলগুলি পড়ার জন্য এই পদ্ধতিটি ব্যবহার করার জন্য কি কোনও ওভারহেড রয়েছে? কেবলমাত্র আপনার অ্যাপ.জেএস ফাইলের রুটগুলির প্রয়োজন?
আবাদাব

আমি @ আবদাবা'র মতোই জানতে চাই। আপনি যখন সার্ভারটি চালু করবেন বা প্রতিটি অনুরোধে কখন এটি মূল্যায়ন করবেন?
imns

19

এবং পূর্ববর্তী উত্তরে আরও তৈরি করুন, রুটস / সূচক.জেজেসের এই সংস্করণটি .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);
    });
}

এর জন্য ধন্যবাদ. আমার কাছে একজন ম্যাকের সাথে .DS_Storeফাইল যুক্ত করেছিল এবং এটি সমস্ত গোলমাল করছে।
JayQuerie.com

19

ফোল্ডারের .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' });
    });
}

8

আমি এই উত্তরটি "এক্সপ্রেস": "^ 4.16.3" দিয়ে আপডেট করার চেষ্টা করছি। এই উত্তরটি শর্টআরউন্ড 1911 এর মতো।

server.js

const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const db = require('./src/config/db');
const routes = require('./src/routes');
const port = 3001;

const app = new express();

//...use body-parser
app.use(bodyParser.urlencoded({ extended: true }));

//...fire connection
mongoose.connect(db.url, (err, database) => {
  if (err) return console.log(err);

  //...fire the routes
  app.use('/', routes);

  app.listen(port, () => {
    console.log('we are live on ' + port);
  });
});

/src/routes/index.js

const express = require('express');
const app = express();

const siswaRoute = require('./siswa_route');

app.get('/', (req, res) => {
  res.json({item: 'Welcome ini separated page...'});
})
.use('/siswa', siswaRoute);

module.exports = app;

/src/routes/siswa_route.js

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.json({item: 'Siswa page...'});
});

module.exports = app;

আমি আশা করি এটি কারও সাহায্য করতে পারে। শুভ কোডিং!


7

আপনি যদি টাইপস্ক্রিপ্ট এবং ইএস 6 দিয়ে এক্সপ্রেস -4x ব্যবহার করেন তবে এটি ব্যবহারের জন্য সেরা টেমপ্লেট হবে:

src/api/login.ts

import express, { Router, Request, Response } from "express";

const router: Router = express.Router();
// POST /user/signin
router.post('/signin', async (req: Request, res: Response) => {
    try {
        res.send('OK');
    } catch (e) {
        res.status(500).send(e.toString());
    }
});

export default router;

src/app.ts

import express, { Request, Response } from "express";
import compression from "compression";  // compresses requests
import expressValidator from "express-validator";
import bodyParser from "body-parser";
import login from './api/login';

const app = express();

app.use(compression());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(expressValidator());

app.get('/public/hc', (req: Request, res: Response) => {
  res.send('OK');
});

app.use('/user', login);

app.listen(8080, () => {
    console.log("Press CTRL-C to stop\n");
});

ব্যবহার তুলনায় অনেক ক্লিনার varএবং module.exports


5

এই উত্তরগুলির একটিতে একটি টুইট

var routes = fs.readdirSync('routes')
      .filter(function(v){
         return (/.js$/).test(v);
      });

অ্যারেতে প্রতিটি ফাইল পরীক্ষার মাধ্যমে ফিল্টার করতে কেবল একটি রেজেক্স ব্যবহার করুন। এটি পুনরাবৃত্তিযোগ্য নয়, তবে এটি ফোল্ডারগুলি ফিল্টার করবে যা .js এ শেষ হয় না


5

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি নিজের মতো করে কিছু বের করার চেষ্টা করছিলাম এবং এটিই আমি শেষ করেছি, তাই অন্য কারও যদি একই সমস্যা হয় তবে আমিও আমার সমাধানটি একই ধরণের সমস্যার সমাধান করতে চেয়েছিলাম। ' আমার আছে কনসাইন নামে একটি দুর্দান্ত নোড মডিউল রয়েছে যা এখানে আপনার জন্য প্রদর্শিত অনেকগুলি ফাইল সিস্টেম স্টাফ করে (যেমন - কোনও রিডিরসিনকি স্টাফ নেই)। উদাহরণ স্বরূপ:

আমার একটি বিশিষ্ট এপিআই অ্যাপ্লিকেশন রয়েছে যা আমি তৈরির চেষ্টা করছি এবং '/ এপিআই / *' এ যাবতীয় অনুরোধগুলি যাচাই করার জন্য আমি রাখতে চাই এবং এপিআইতে যাওয়া সমস্ত রুটগুলিকে আমি তাদের নিজস্ব ডিরেক্টরিতে সংরক্ষণ করতে চাই (আসুন একে একে 'এপি' বলুন)। অ্যাপ্লিকেশনটির মূল অংশে:

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

রুট ডিরেক্টরিটির ভিতরে আমার কাছে "এপিআই" নামে একটি ডিরেক্টরি এবং অ্যাপি.জেএস নামে একটি ফাইল রয়েছে have 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;

প্রত্যাশা অনুযায়ী সবকিছুই কাজ করেছিল। আশা করি এটি কাউকে সাহায্য করবে।


5

আপনি যদি আপনার রুটগুলি আরও ভালভাবে সংগঠিত করতে একটি পৃথক .js ফাইল চান তবে কেবল app.jsফাইল সিস্টেমে তার অবস্থান নির্দেশ করে ফাইলের মধ্যে একটি ভেরিয়েবল তৈরি করুন:

var wf = require(./routes/wf);

তারপর,

app.get('/wf', wf.foo );

যেখানে .fooআপনার wf.jsফাইলে কিছু ফাংশন ঘোষণা করা হয়েছে । যেমন

// wf.js file 
exports.foo = function(req,res){

          console.log(` request object is ${req}, response object is ${res} `);

}

1
+1 টি। অফিসিয়াল উদাহরণে এটি এখানে দেখানো হয়েছে: github.com
ম্যাট ব্রাউন

1
এটি কি app.js এর অধীনে বৈশ্বিক ফাংশন এবং ভেরিয়েবলগুলি ভাগ করে নেওয়ার জন্য কাজ করে? বা wf.fooঅন্য উপস্থাপিত সমাধানগুলির মতো তারা সুযোগের বাইরে থাকায় আপনি কি তাদের এগুলিতে "পাস" করতে পারেন ? আমি সেই ক্ষেত্রে উল্লেখ করছি যেখানে সাধারণত আপনি wf.foo- তে ভাগ করা ভেরিয়েবল / ফাংশনগুলি অ্যাক্সেস করতে পারতেন যদি এটি অ্যাপ্লিকেশন থেকে আলাদা না করা হত।
ডেভিড

হ্যাঁ এটি করে, আপনি যদি app.js এ 'foo' ফাংশন ঘোষণা করেন তবে app.get ('/ wf', foo); কাজ করবে
নিয়ালল জিজি


0

এটি সম্ভবত সবচেয়ে ভয়ঙ্কর স্ট্যাক ওভারফ্লো প্রশ্ন / উত্তর (গুলি)। আমি ভালবাসেন উপরে স্যাম / ব্র্যাড এর সমাধান। ভেবেছিলাম যে আমি প্রয়োগ করেছি এমন অ্যাসিঙ্ক সংস্করণটি দিয়ে আমি চিম করব:

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-ing './routes'। ফলস্বরূপ, আমি চেকটি বাদ দিচ্ছি index.jsকারণ আমি চাই অন্তর্ভুক্ত করতে ।

সম্পাদনা: আপনি এটিকে কোনও ফাংশনে রাখতে পারেন এবং এটিকে পুনরাবৃত্তভাবে কল করতে পারেন (আমি এটি দেখানোর জন্য উদাহরণটি সম্পাদনা করেছি) যদি আপনি নিজের রুটিকে স্বেচ্ছাসহ গভীরতার ফোল্ডারে বাসাতে চান।


2
আপনি কেন একটি আইসএন সংস্করণ চান? সম্ভবত আপনি ট্র্যাফিক সরবরাহ শুরু করার আগে আপনার সমস্ত রুট সেট আপ করতে চান বা অন্যথায় আপনি 'মিথ্যা' 404 গুলি প্রেরণ করতে পারেন।
জো আব্রামস

6
প্রকৃতপক্ষে. আমি এখনও লিখেছি যখন নোড শিখতে। আমি পূর্বের সাথে একমত যে এটির কোনও অর্থ নেই।
tandrewnichols

0

আপনি সমস্ত রুট ফাংশন অন্য ফাইলগুলিতে (মডিউল) রাখতে পারেন এবং এটিকে মূল সার্ভার ফাইলে লিঙ্ক করতে পারেন। প্রধান এক্সপ্রেস ফাইলে একটি ফাংশন যুক্ত করুন যা মডিউলটিকে সার্ভারের সাথে সংযুক্ত করবে:

   function link_routes(app, route_collection){
       route_collection['get'].forEach(route => app.get(route.path, route.func));
       route_collection['post'].forEach(route => app.post(route.path, route.func));
       route_collection['delete'].forEach(route => app.delete(route.path, route.func));
       route_collection['put'].forEach(route => app.put(route.path, route.func));
   }

এবং প্রতিটি রুট মডেলের জন্য সেই ফাংশনটি কল করুন:

link_routes(app, require('./login.js'))

মডিউল ফাইলগুলিতে (উদাহরণস্বরূপ - login.js ফাইল), যথারীতি ফাংশনগুলি সংজ্ঞায়িত করুন:

const login_screen = (req, res) => {
    res.sendFile(`${__dirname}/pages/login.html`);
};

const forgot_password = (req, res) => {
    console.log('we will reset the password here')
}

এবং অনুরোধ পদ্ধতির সাথে এটিকে কী হিসাবে রফতানি করুন এবং মানটি হ'ল বস্তুর একটি অ্যারে, প্রতিটি পথ এবং ফাংশন কী সহ with

module.exports = {
   get: [{path:'/',func:login_screen}, {...} ],
   post: [{path:'/login:forgotPassword', func:forgot_password}]
};   
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.