এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটিতে app.js
ফাইলটি ভেঙে ফেলা এবং মডুলারাইজ করার জন্য কি সাধারণ কনভেনশন রয়েছে ? নাকি সব কিছুই একক ফাইলে রাখা সাধারণ?
এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটিতে app.js
ফাইলটি ভেঙে ফেলা এবং মডুলারাইজ করার জন্য কি সাধারণ কনভেনশন রয়েছে ? নাকি সব কিছুই একক ফাইলে রাখা সাধারণ?
উত্তর:
আমার নিম্নরূপটি ভেঙে গেছে:
~/app
|~controllers
| |-monkey.js
| |-zoo.js
|~models
| |-monkey.js
| |-zoo.js
|~views
| |~zoos
| |-new.jade
| |-_form.jade
|~test
| |~controllers
| |-zoo.js
| |~models
| |-zoo.js
|-index.js
যা প্রাসঙ্গিক তা ফিরিয়ে দিতে আমি রফতানি ব্যবহার করি। উদাহরণস্বরূপ, আমি যে মডেলগুলি করি তা:
module.exports = mongoose.model('PhoneNumber', PhoneNumberSchema);
এবং তারপরে যদি আমার কোনও ফোন নম্বর তৈরি করতে হয় তবে এটি এতটা সহজ:
var PhoneNumber = require('../models/phoneNumber');
var phoneNumber = new PhoneNumber();
যদি আমাকে স্কিমা ব্যবহার করতে হয় তবে PhoneNumber.schema
(যা ধরে নিয়েছে যে আমরা রুট ফোল্ডার থেকে কাজ করছি এবং 1 স্তরের উপরে যেতে হবে এবং তারপরে মডেলগুলিতে নামতে হবে)
দ্রুতগামী উইকি এটি উপরে নির্মিত অবকাঠামো একটি তালিকা আছে।
এর মধ্যে আমি মনে করি টুইটারের ম্যাটাডোরগুলি বেশ ভালভাবে কাঠামোযুক্ত। তারা কীভাবে অ্যাপটির অংশগুলি লোড করে দেয় সে সম্পর্কে আমরা আসলে একটি খুব অনুরূপ পন্থা ব্যবহার করেছি।
derby.js এছাড়াও অত্যন্ত আকর্ষণীয় দেখায়। এটি হাইপগুলি ছাড়াই উল্কাপথের সমান এবং প্রকৃতপক্ষে creditণ প্রদানের ক্ষেত্রে ক্রেডিট দেয় (উল্লেখযোগ্যভাবে নোড এবং এক্সপ্রেস)।
আপনি যদি কফিস্ক্রিপ্টের অনুরাগী হন (আমি নই) এবং রিয়াআআআআআআআআআআালি হ'ল রেলের এলএন্ডএফ চান, সেখানে টাওয়ার.জেও রয়েছে ।
আপনি যদি রেলের সাথে পরিচিত হন এবং কিছু ধারণার ব্লিড-ওভারকে কিছু মনে না করেন সেখানে লোকোমোটিভ রয়েছে । এটি এক্সপ্রেসে নির্মিত হালকা ওজনের ফ্রেমওয়ার্ক। এটি আরআর এর মতো একটি অনুরূপ কাঠামোযুক্ত এবং আরও কিছু প্রাথমিক ধারণা (যেমন রাউটিং) এর উপর বহন করে।
আপনি এটি ব্যবহার করার পরিকল্পনা না করলেও এটি পরীক্ষা করে দেখার মতো।
নোডেজ-এক্সপ্রেস-মঙ্গুজ-ডেমো আমার কীভাবে কাঠামোবদ্ধ হয়েছে তার সাথে খুব মিল। এটা দেখ.
সতর্কতা: রেফারেন্সিং কোড আমি নোড নকআউটের জন্য একসাথে হ্যাক করেছি, এটি একধরণের কাজ তবে মার্জিত বা পালিশ থেকে অনেক দূরে।
বিভাজন সম্পর্কে আরও সুনির্দিষ্ট হওয়ার জন্য app.js
আমার কাছে নিম্নলিখিত অ্যাপ্লিকেশন.জেএস ফাইল রয়েছে file
var express = require('express'),
bootstrap = require('./init/bootstrap.js'),
app = module.exports = express.createServer();
bootstrap(app);
এর মূলত অর্থ আমি আমার সমস্ত বুটস্ট্র্যাপিংকে একটি পৃথক ফাইলে রাখি, তারপরে আমি সার্ভারটি বুটস্ট্র্যাপ করি।
তাহলে বুটস্ট্র্যাপ কী করে ?
var configure = require("./app-configure.js"),
less = require("./watch-less.js"),
everyauth = require("./config-everyauth.js"),
routes = require("./start-routes.js"),
tools = require("buffertools"),
nko = require("nko"),
sessionStore = new (require("express").session.MemoryStore)()
module.exports = function(app) {
everyauth(app);
configure(app, sessionStore);
less();
routes(app, sessionStore);
nko('/9Ehs3Dwu0bSByCS');
app.listen(process.env.PORT);
console.log("server listening on port xxxx");
};
ভাল এটি সুন্দর খণ্ডগুলিতে সমস্ত সার্ভার ইনিশিয়েশন সেটআপ বিভক্ত করে। বিশেষভাবে
app.configure
)যেমন উদাহরণস্বরূপ রাউটিং ফাইলটি দেখুন
var fs = require("fs"),
parseCookie = require('connect').utils.parseCookie;
module.exports = function(app, sessionStore) {
var modelUrl = __dirname + "/../model/",
models = fs.readdirSync(modelUrl),
routeUrl = __dirname + "/../route/"
routes = fs.readdirSync(routeUrl);
এখানে আমি আমার সমস্ত মডেল এবং রুটগুলিকে ফাইলের অ্যারে হিসাবে লোড করি।
দাবি অস্বীকার: আপনি HTTP সার্ভার শুরু করার আগে (আগে ) কল করা readdirSync
ঠিক তখনই ঠিক । সার্ভার শুরুর সময় সিঙ্ক্রোনিয়াস ব্লকিং কলগুলি কলটি কোডটিকে আরও পঠনযোগ্য করে তোলে (এটি মূলত একটি হ্যাক).listen
var io = require("socket.io").listen(app);
io.set("authorization", function(data, accept) {
if (data.headers.cookie) {
data.cookie = parseCookie(data.headers.cookie);
data.sessionId = data.cookie['express.sid'];
sessionStore.get(data.sessionId, function(err, session) {
if (err) {
return accept(err.message, false);
} else if (!(session && session.auth)) {
return accept("not authorized", false)
}
data.session = session;
accept(null, true);
});
} else {
return accept('No cookie', false);
}
});
এখানে আমি सॉকেট.আইওকে সত্যিকার অর্থে অনুমোদনের জন্য ঘুষি দিচ্ছি তারপরে কোনও টম এবং জ্যাককে আমার সকেট.ইও সার্ভারের সাথে কথা বলার জন্য
routes.forEach(function(file) {
var route = require(routeUrl + file),
model = require(modelUrl + file);
route(app, model, io);
});
};
এখানে আমি রুট ফাইল থেকে প্রত্যাবর্তিত প্রতিটি রুট অবজেক্টে প্রাসঙ্গিক মডেলটি পাস করে আমার রুটগুলি শুরু করি।
মূলত টুকরোটি হ'ল আপনি সবকিছু সামান্য সামান্য মডিউলগুলিতে व्यवस्थित করেন এবং তারপরে কিছু বুটস্ট্র্যাপিং প্রক্রিয়া থাকে।
আমার অন্যান্য প্রকল্পে (আমার ব্লগ) একই ধরণের কাঠামোযুক্ত একটি init ফাইল রয়েছে ।
দাবি অস্বীকার: ব্লগটি ভেঙে গেছে এবং তৈরি হচ্ছে না, আমি এটি নিয়ে কাজ করছি।
রক্ষণীয় রাউটিং সংগঠন জন্য আপনি চেক আউট করতে পারেন এই নিবন্ধটি সম্পর্কে এক্সপ্রেস-routescan নোড মডিউল এবং এটি চেষ্টা করুন। এটি আমার পক্ষে সেরা সমাধান।
এক্সপ্রেস-জেনারেটরের সরঞ্জামটির উপরে আমার অ্যাপ্লিকেশনগুলি তৈরি করা আছে। আপনি এটি চালিয়ে ইনস্টল করতে পারেন npm install express-generator -g
এবং এটি ব্যবহার করে চালাতে পারেন express <APP_NAME>
।
আপনাকে একটি দৃষ্টিকোণ দেওয়ার জন্য, আমার ছোট অ্যাপ্লিকেশনটির কাঠামোর একটি দেখতে এই রকম হয়েছে:
~/
|~bin
| |-www
|
|~config
| |-config.json
|
|~database
| |-database.js
|
|~middlewares
| |-authentication.js
| |-logger.js
|
|~models
| |-Bank.js
| |-User.js
|
|~routes
| |-index.js
| |-banks.js
| |-users.js
|
|~utilities
| |-fiat-converersion.js
|
|-app.js
|-package.json
|-package-lock.json
এই কাঠামোটি সম্পর্কে আমি পছন্দ করি একটি দুর্দান্ত জিনিস আমি যে কোনও এক্সপ্রেস অ্যাপ্লিকেশনটি বিকাশ করি তার জন্য গ্রহণগুলি শেষ করে সেগুলি হল রুটগুলি যেভাবে সাজানো হয়। app.use()
বিশেষত ফাইলটি বড় হওয়ার সাথে সাথে আমি প্রতিটি রুটের ফাইলগুলি অ্যাপ.জেএস এবং প্রতিটি রুটে প্রবেশ করা পছন্দ করি না । এর মতো, আমি আমার সমস্ত app.use()
একটি ./routes/index.js ফাইলে গ্রুপবদ্ধ এবং কেন্দ্রীভূত করতে সহায়ক বলে মনে করেছি ।
শেষ পর্যন্ত, আমার অ্যাপ্লিকেশন.জেএস দেখতে এমন কিছু দেখাচ্ছে:
...
const express = require('express');
const app = express();
...
require('./routes/index')(app);
এবং আমার ./routes/index.js দেখতে এরকম কিছু দেখাবে:
module.exports = (app) => {
app.use('/users', require('./users'));
app.use('/banks', require('./banks'));
};
আমি কেবলমাত্র সক্ষম হয়েছি require(./users)
কারণ আমি ব্যবহারকারীদের রুটটি এক্সপ্রেস ব্যবহার করে লিখেছি ou
এটি আমার ./routers/users.js রুটে আপনি কী জরিমানা করবেন তার একটি উদাহরণ:
const router = require('express').Router();
router.post('/signup', async (req, res) => {
// Signup code here
});
module.exports = router;
আশা করি এটি আপনার প্রশ্নের জবাব দিতে সহায়তা করেছে! ভাগ্য সুপ্রসন্ন হোক!