আমি কীভাবে একটি পরিবর্তনশীল সেট করব app.js
এবং এটি সমস্ত রুটে উপলভ্য হবে, রুটে index.js
অবস্থিত ফাইলটিতে অন্ততপক্ষে । এক্সপ্রেস ফ্রেমওয়ার্ক এবংnode.js
উত্তর:
একটি বৈশ্বিক পরিবর্তনশীল করতে, কেবল var
কীওয়ার্ড ছাড়াই এটি ঘোষণা করুন । (সাধারণত এটি বলা সর্বোত্তম অনুশীলন নয়, তবে কিছু ক্ষেত্রে এটি কার্যকর হতে পারে - কেবল সাবধানতা অবলম্বন করুন যেহেতু এটি ভেরিয়েবলটি সর্বত্র উপলব্ধ করে দেবে))
ভিশনমিডিয়া / স্ক্রিনশট-অ্যাপের একটি উদাহরণ এখানে example
ফাইল app.js :
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, redis = require('redis')
, http = require('http');
app = express();
//... require() route files
ফাইল রুট / main.js
//we can now access 'app' without redeclaring it or passing it in...
/*
* GET home page.
*/
app.get('/', function(req, res, next){
res.render('index');
});
//...
app
যুক্ত হয়?
correct
।
এক্সপ্রেস অবজেক্টে উপলব্ধ "সেট" এবং "get" পদ্ধতিগুলি ব্যবহার করে এটি করা খুব সহজ।
উদাহরণস্বরূপ উদাহরণস্বরূপ, বলুন যে আপনার কনফিগারেশন সম্পর্কিত স্টাফের সাথে কনফিগার নামে একটি ভেরিয়েবল রয়েছে যা আপনি অন্য জায়গায় উপলব্ধ থাকতে চান:
App.js এ:
var config = require('./config');
app.configure(function() {
...
app.set('config', config);
...
}
রুট / ইনডেক্স.জেজে
exports.index = function(req, res){
var config = req.app.get('config');
// config is now available
...
}
req.app.get('name')
একটি কবজ মত কাজ করে। এই সম্পত্তিটি মিডওয়্যারটি ব্যবহার করে এমন এক্সপ্রেস অ্যাপ্লিকেশনটির উদাহরণটির একটি রেফারেন্স ধারণ করে। expressjs.com/pt-br/api.html#req.app
এটি করার একটি ঝরঝরে উপায় হ'ল app.locals
এক্সপ্রেস দ্বারা সরবরাহিত
ব্যবহার use এখানে ডকুমেন্টেশন দেওয়া আছে।
// In app.js:
app.locals.variable_you_need = 42;
// In index.js
exports.route = function(req, res){
var variable_i_needed = req.app.locals.variable_you_need;
}
গ্লোবাল ভেরিয়েবল ঘোষণার জন্য আপনার গ্লোবাল অবজেক্ট ব্যবহার করা দরকার । Global.yourVariableName পছন্দ করুন। তবে এটি একটি সত্য উপায় নয়। মডিউলগুলির মধ্যে ভেরিয়েবলগুলি ভাগ করতে ইঞ্জেকশন স্টাইলটি ব্যবহার করার চেষ্টা করুন
someModule.js:
module.exports = function(injectedVariable) {
return {
somePublicMethod: function() {
},
anotherPublicMethod: function() {
},
};
};
app.js
var someModule = require('./someModule')(someSharedVariable);
অথবা আপনি এটি করতে সারোগেট অবজেক্টটি ব্যবহার করতে পারেন। ভালো লেগেছে হাব ।
someModule.js:
var hub = require('hub');
module.somePublicMethod = function() {
// We can use hub.db here
};
module.anotherPublicMethod = function() {
};
app.js
var hub = require('hub');
hub.db = dbConnection;
var someModule = require('./someModule');
এখানে সংক্ষেপে ভালভাবে ব্যাখ্যা করা হল:
http://www.hacksparrow.com/global-variables-in-node-js.html
সুতরাং আপনি নোড মডিউলগুলির একটি সেট, সম্ভবত এক্সপ্রেস.জেএস এর মতো কাঠামো নিয়ে কাজ করছেন এবং হঠাৎ করে কিছু পরিবর্তনশীলকে বিশ্বব্যাপী করার প্রয়োজনীয়তা অনুভব করছেন। আপনি কীভাবে নোড.জেজে ভেরিয়েবলগুলি বিশ্বব্যাপী করবেন?
এইটির সর্বাধিক সাধারণ পরামর্শ হ'ল হয় "বর্ণ মূলশব্দ ব্যতীত ভেরিয়েবল ঘোষণা করা" বা "গ্লোবাল অবজেক্টে ভেরিয়েবল যুক্ত করা" বা "গ্লোবাল অবজেক্টে ভেরিয়েবল যুক্ত করা" to তুমি কোনটি ব্যবহার কর?
প্রথমে, আসুন গ্লোবাল অবজেক্টটি বিশ্লেষণ করা যাক। একটি টার্মিনাল খুলুন, একটি নোড REPL (প্রম্পট) শুরু করুন।
> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name
'Sparrow'
সবচেয়ে সহজ উপায় হ'ল আপনার অ্যাপ.জেজে একটি গ্লোবাল ভেরিয়েবল ঘোষণা করা, তাড়াতাড়ি:
global.mySpecialVariable = "something"
তারপরে যে কোনও রুটে আপনি এটি পেতে পারেন:
console.log(mySpecialVariable)
এটি একটি সহায়ক প্রশ্ন ছিল, তবে প্রকৃত কোড উদাহরণ দিয়ে আরও বেশি কিছু হতে পারে। এমনকি লিঙ্কযুক্ত নিবন্ধটি আসলে বাস্তবায়ন দেখায় না। আমি অতএব বিনীতভাবে জমা দিচ্ছি:
আপনার app.js
ফাইলে, ফাইলের শীর্ষস্থানীয়:
var express = require('express')
, http = require('http')
, path = require('path');
app = express(); //IMPORTANT! define the global app variable prior to requiring routes!
var routes = require('./routes');
app.js এর পদ্ধতির কোনও রেফারেন্স থাকবে না app.get()
। এগুলি পৃথক রুটের ফাইলগুলিতে সংজ্ঞায়িত করতে ছেড়ে দিন।
routes/index.js
:
require('./main');
require('./users');
এবং পরিশেষে, একটি আসল রুট ফাইল routes/main.js
,:
function index (request, response) {
response.render('index', { title: 'Express' });
}
app.get('/',index); // <-- define the routes here now, thanks to the global app variable
আমার পছন্দের উপায়টি হল বিজ্ঞপ্তি নির্ভরতা * ব্যবহার করা, যা নোড সমর্থন করে
var app = module.exports = express();
আপনার ব্যবসায়ের প্রথম অর্ডার হিসাবে সংজ্ঞায়িত করা হয়েছেvar app = require('./app')
অ্যাক্সেস করতে পারেvar express = require('express');
var app = module.exports = express(); //now app.js can be required to bring app into any file
//some app/middleware, config, setup, etc, including app.use(app.router)
require('./routes'); //module.exports must be defined before this line
var app = require('./app');
app.get('/', function(req, res, next) {
res.render('index');
});
//require in some other route files...each of which requires app independently
require('./user');
require('./blog');
অন্যরা যেমন ইতিমধ্যে ভাগ করে নিয়েছে, এটির app.set('config', config)
জন্য দুর্দান্ত। আমি কেবল এমন কিছু যুক্ত করতে চেয়েছিলাম যা বিদ্যমান জবাবগুলিতে আমি দেখতে পাইনি যা বেশ গুরুত্বপূর্ণ। একটি নোড.জেএস উদাহরণটি সমস্ত অনুরোধের মধ্যে ভাগ করা হয়, তাই বিশ্বব্যাপী কিছু ভাগ করা config
বা router
বস্তু ভাগ করা খুব ব্যবহারিক হতে পারে তবে বিশ্বব্যাপী রানটাইম ডেটা সংরক্ষণ করা অনুরোধ এবং ব্যবহারকারীদের জুড়ে উপলব্ধ । এই খুব সহজ উদাহরণ বিবেচনা করুন:
var express = require('express');
var app = express();
app.get('/foo', function(req, res) {
app.set('message', "Welcome to foo!");
res.send(app.get('message'));
});
app.get('/bar', function(req, res) {
app.set('message', "Welcome to bar!");
// some long running async function
var foo = function() {
res.send(app.get('message'));
};
setTimeout(foo, 1000);
});
app.listen(3000);
আপনি যদি যান /bar
এবং অন্য একটি অনুরোধ হিট হয়ে যায় তবে /foo
আপনার বার্তাটি "ফুতে স্বাগতম!"! এটি একটি নির্বোধ উদাহরণ, তবে এটি পয়েন্টটি পেয়ে যায়।
এ সম্পর্কে কিছু আকর্ষণীয় বিষয় রয়েছে কেন বিভিন্ন নোড.জেএস সেশনগুলি ভেরিয়েবলগুলি ভাগ করে? ।
আমি একই সমস্যাটি সমাধান করেছি, তবে আমাকে আরও কোড লিখতে হয়েছিল। আমি একটি server.js
ফাইল তৈরি করেছি , যা রুটগুলি রেজিস্টার করতে এক্সপ্রেস ব্যবহার করে। এটি একটি ফাংশন প্রকাশ করে register
, এটি অন্যান্য মডিউলগুলি তাদের নিজস্ব রুটগুলি রেজিস্টার করতে ব্যবহার করতে পারে। এটি কোনও ফাংশন প্রকাশ করে, startServer
কোনও বন্দর শোনার জন্য
server.js
const express = require('express');
const app = express();
const register = (path,method,callback) => methodCalled(path, method, callback)
const methodCalled = (path, method, cb) => {
switch (method) {
case 'get':
app.get(path, (req, res) => cb(req, res))
break;
...
...
default:
console.log("there has been an error");
}
}
const startServer = (port) => app.listen(port, () => {console.log(`successfully started at ${port}`)})
module.exports = {
register,
startServer
}
অন্য মডিউলে, কোনও রুট তৈরি করতে এই ফাইলটি ব্যবহার করুন।
help.js
const app = require('../server');
const registerHelp = () => {
app.register('/help','get',(req, res) => {
res.send("This is the help section")
}),
app.register('/help','post',(req, res) => {
res.send("This is the help section")
})}
module.exports = {
registerHelp
}
মূল ফাইলে, উভয়ই বুটস্ট্র্যাপ করুন।
app.js
require('./server').startServer(7000)
require('./web/help').registerHelp()
এটি বেশ সহজ জিনিস, তবে মানুষের উত্তর একই সাথে বিভ্রান্ত ও জটিল।
আপনি কীভাবে আপনার express
অ্যাপ্লিকেশনে গ্লোবাল ভেরিয়েবল সেট করতে পারেন তা আমাকে আপনাকে দেখাতে দিন । সুতরাং আপনি প্রয়োজন হিসাবে যে কোনও রুট থেকে এটি অ্যাক্সেস করতে পারেন।
ধরা যাক আপনি আপনার প্রধান /
রুট থেকে একটি বৈশ্বিক পরিবর্তনশীল সেট করতে চান
router.get('/', (req, res, next) => {
req.app.locals.somethingNew = "Hi setting new global var";
});
সুতরাং আপনি সমস্ত রুট থেকে req.app পাবেন। এবং তারপরে আপনাকে locals
বৈশ্বিক ডেটা সেট করতে ব্যবহার করতে হবে। উপরে শো মত আপনি সব সেট। এখন
আমি আপনাকে কীভাবে সেই ডেটা ব্যবহার করব তা দেখাব
router.get('/register', (req, res, next) => {
console.log(req.app.locals.somethingNew);
});
উপরের মতো register
রুট থেকে আপনি ডেটা অ্যাক্সেস করছেন আগে সেট করা হয়েছে।
এইভাবে আপনি এই জিনিসটি কাজ করতে পারেন!
জন গর্ডনের জবাব হ'ল বহু চেষ্টা করা সাইট থেকে অনেকগুলি অর্ধ-বর্ণিত / নথিভুক্ত জবাব আমি দিয়েছি, যা আসলে কাজ করেছিল। আপনাকে ধন্যবাদ মিঃ গর্ডন দুঃখিত, আপনার উত্তরটি টিক দেওয়ার জন্য আমার কাছে পয়েন্ট নেই।
আমি যুক্ত করতে চাই, নোড-রুট-ফাইল-বিভাজনে অন্যান্য নবজাতকদের জন্য, 'সূচক' এর জন্য বেনামে ফাংশনটির ব্যবহারটি প্রায়শই দেখা যাবে, তাই মূল.জদের জন্য জন উদাহরণ ব্যবহার করে, কার্যত- সমতুল্য কোডগুলির মধ্যে একটিটি সাধারণত পাওয়া যাবে:
app.get('/',(req, res) {
res.render('index', { title: 'Express' });
});
অ্যাপ্লিকেশন। সমস্ত () পদ্ধতি নির্দিষ্ট পাথ উপসর্গ বা স্বেচ্ছাসেবী ম্যাচের জন্য "গ্লোবাল" যুক্তি ম্যাপিংয়ের জন্য কার্যকর।
আমার ক্ষেত্রে, আমি কনফিগারেশন পরিচালনার জন্য স্বতন্ত্র ব্যবহার করছি ,
app.all('*', function (req, res, next) {
confit(basedir).create(function (err, config) {
if (err) {
throw new Error('Failed to load configuration ', err);
}
app.set('config', config);
next();
});
});
রুটে, আপনি সহজভাবে না req.app.get('config').get('cookie');
req.app.locals
।