অ্যাপ্লিকেশনগুলিতে গ্লোবাল ভেরিয়েবল? রুটে কি অ্যাক্সেসযোগ্য?


91

আমি কীভাবে একটি পরিবর্তনশীল সেট করব app.jsএবং এটি সমস্ত রুটে উপলভ্য হবে, রুটে index.jsঅবস্থিত ফাইলটিতে অন্ততপক্ষে । এক্সপ্রেস ফ্রেমওয়ার্ক এবংnode.js


4
App.locals বস্তুর বৈশিষ্ট্য যে আবেদন মধ্যে স্থানীয় ভেরিয়েবল আছে। আপনার রুট ফাইলে এটির সাথে উল্লেখ করুন req.app.locals
রনি রায়স্টন

উত্তর:


65

একটি বৈশ্বিক পরিবর্তনশীল করতে, কেবল 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');
});

//...

6
একটি নোট হিসাবে, চারপাশের ভেরিয়েবলগুলি পাস করার এবং তাদের তাত্ক্ষণিক সম্পর্কে স্পষ্ট হওয়া ভাল generally যাতে আপনি দুর্ঘটনাক্রমে অ্যাপ্লিকেশনটির অন্য কোথাও রেফটি সরিয়ে ফেলবেন না বা আপনার কাছে কী আছে।
পল

4
এটি সত্যিই খারাপ ফর্ম, যেমন পল উল্লেখ করেছিলেন। আমি নীচে উল্লিখিত ইনজেকশন প্যাটার্নটি পরামর্শ করব। হ্যাঁ, আরও বয়লার প্লেট কোড যাতে এটি "সুন্দর" দেখাচ্ছে না তবে এটি আপনার কোডটি মডুলার হওয়ার বিষয়টি নিশ্চিত করে ... এমন কিছু যা আপনি পছন্দ করেন যদি এটি আপনার শেষ প্রকল্প নয়;)
srquinn

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

4
কেউ জাভাস্ক্রিপ্টের শব্দার্থবিজ্ঞানের প্রসঙ্গে কেন কাজ করে তা ব্যাখ্যা করতে পারে? কোন সুযোগের সাথে appযুক্ত হয়?
আলী

আমি মনে করি না যে এই উত্তরটি একটি হিসাবে চিহ্নিত করা উচিত correct
কোড কুকার

93

এক্সপ্রেস অবজেক্টে উপলব্ধ "সেট" এবং "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
  ...
}

'অ্যাপ' গ্লোবাল সেট করবেন? হ্যাঁ. তবে সমস্যা এবং বিশৃঙ্খলা থেকে আমাদের বাঁচানোর জন্য এই পদ্ধতিটি সেরা।
ডিপ্রোয়ার্ট

53
প্রয়াত comers জন্য: app.configure দ্রুতগামী 4.x সরানো হয়
জামিল

চমৎকার, req.app.get('name')একটি কবজ মত কাজ করে। এই সম্পত্তিটি মিডওয়্যারটি ব্যবহার করে এমন এক্সপ্রেস অ্যাপ্লিকেশনটির উদাহরণটির একটি রেফারেন্স ধারণ করে। expressjs.com/pt-br/api.html#req.app
লাজারো ফার্নান্দিস লিমা সুলেমান

58

এটি করার একটি ঝরঝরে উপায় হ'ল 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;
}

4
আমি এই পদ্ধতিটি HTTP পরিষেবাগুলি সনাক্ত করতে এবং ইউনিট পরীক্ষায় সহজেই ওভাররাইড করতে ব্যবহার করি।
অ্যালেক্স

28

গ্লোবাল ভেরিয়েবল ঘোষণার জন্য আপনার গ্লোবাল অবজেক্ট ব্যবহার করা দরকার । 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');

7

এখানে সংক্ষেপে ভালভাবে ব্যাখ্যা করা হল:

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'

এক্সপ্রেসে - জ্যাশিন্ট বা আবরণ ব্যবহার করার সময়, সাধারণভাবে - এটি একটি সমস্যা হয়ে ওঠে।
স্টিভেন

6

সবচেয়ে সহজ উপায় হ'ল আপনার অ্যাপ.জেজে একটি গ্লোবাল ভেরিয়েবল ঘোষণা করা, তাড়াতাড়ি:

global.mySpecialVariable = "something"

তারপরে যে কোনও রুটে আপনি এটি পেতে পারেন:

console.log(mySpecialVariable)

4
এক্সপ্রেসে - জ্যাশিন্ট বা আবরণ ব্যবহার করার সময়, সাধারণভাবে - এটি একটি সমস্যা হয়ে ওঠে।
স্টিভেন

5

এটি একটি সহায়ক প্রশ্ন ছিল, তবে প্রকৃত কোড উদাহরণ দিয়ে আরও বেশি কিছু হতে পারে। এমনকি লিঙ্কযুক্ত নিবন্ধটি আসলে বাস্তবায়ন দেখায় না। আমি অতএব বিনীতভাবে জমা দিচ্ছি:

আপনার 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

4

আমার পছন্দের উপায়টি হল বিজ্ঞপ্তি নির্ভরতা * ব্যবহার করা, যা নোড সমর্থন করে

  • app.js এ var app = module.exports = express();আপনার ব্যবসায়ের প্রথম অর্ডার হিসাবে সংজ্ঞায়িত করা হয়েছে
  • এখন যে কোনও মডিউল প্রয়োজন পরে এটি var app = require('./app')অ্যাক্সেস করতে পারে


app.js

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');

দুর্দান্ত টিপ। আমি এটি করার জন্য প্রয়োজনীয় ('./ মাইরোয়েটস') (অ্যাপ) পদ্ধতি থেকে সরিয়েছি এবং আমার রুটগুলির কোনওটি কেন কাজ করে না তা নির্ধারণের চেষ্টা করার জন্য 10 মিনিটের জন্য একটি প্রাচীরের বিরুদ্ধে আমার মাথাটি আঘাত করে। কোনও ক্রিয়াকলাপের বাইরে myroutes.js এ রুটের স্পেসিফিকেশন নিতে ভুলবেন না। দোহ!
গ্রেগ

2

অন্যরা যেমন ইতিমধ্যে ভাগ করে নিয়েছে, এটির 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আপনার বার্তাটি "ফুতে স্বাগতম!"! এটি একটি নির্বোধ উদাহরণ, তবে এটি পয়েন্টটি পেয়ে যায়।

এ সম্পর্কে কিছু আকর্ষণীয় বিষয় রয়েছে কেন বিভিন্ন নোড.জেএস সেশনগুলি ভেরিয়েবলগুলি ভাগ করে?


1

আমি একই সমস্যাটি সমাধান করেছি, তবে আমাকে আরও কোড লিখতে হয়েছিল। আমি একটি 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()

1

এটি বেশ সহজ জিনিস, তবে মানুষের উত্তর একই সাথে বিভ্রান্ত ও জটিল।

আপনি কীভাবে আপনার 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রুট থেকে আপনি ডেটা অ্যাক্সেস করছেন আগে সেট করা হয়েছে।

এইভাবে আপনি এই জিনিসটি কাজ করতে পারেন!


0

জন গর্ডনের জবাব হ'ল বহু চেষ্টা করা সাইট থেকে অনেকগুলি অর্ধ-বর্ণিত / নথিভুক্ত জবাব আমি দিয়েছি, যা আসলে কাজ করেছিল। আপনাকে ধন্যবাদ মিঃ গর্ডন দুঃখিত, আপনার উত্তরটি টিক দেওয়ার জন্য আমার কাছে পয়েন্ট নেই।

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

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

0

আমি app.all ব্যবহার করেছি

অ্যাপ্লিকেশন। সমস্ত () পদ্ধতি নির্দিষ্ট পাথ উপসর্গ বা স্বেচ্ছাসেবী ম্যাচের জন্য "গ্লোবাল" যুক্তি ম্যাপিংয়ের জন্য কার্যকর।

আমার ক্ষেত্রে, আমি কনফিগারেশন পরিচালনার জন্য স্বতন্ত্র ব্যবহার করছি ,

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');

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.