मार्गों में app.js में सुलभ वैश्विक चर?


91

मैं एक चर कैसे सेट करूं app.jsऔर क्या यह सभी मार्गों में उपलब्ध है, मार्गों में index.jsस्थित फ़ाइल में कम से कम । एक्सप्रेस ढांचे का उपयोग कर औरnode.js


1
App.locals वस्तु गुण है कि आवेदन के भीतर स्थानीय चर रहे हैं। अपनी रूट फ़ाइल में, इसे देखें req.app.locals
रॉनी रोइस्टन

जवाबों:


65

एक वैश्विक चर बनाने के लिए, बस इसे varकीवर्ड के बिना घोषित करें । (सामान्यतया यह सबसे अच्छा अभ्यास नहीं है, लेकिन कुछ मामलों में यह उपयोगी हो सकता है - बस सावधान रहें क्योंकि यह चर को हर जगह उपलब्ध कराएगा।)

यहाँ visionmedia / स्क्रीनशॉट-ऐप से एक उदाहरण दिया गया है

फ़ाइल 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
एक नोट के रूप में, आमतौर पर वेरिएबल्स को इधर-उधर से गुजारना और उन्हें इंस्टेंट करने के बारे में स्पष्ट होना बेहतर होता है, इसलिए आप गलती से ऐप में कहीं और रेफरी को नंगा कर दें, या आपके पास क्या है।
पॉल

3
यह वास्तव में बुरा रूप है, जैसा कि पॉल ने उल्लेख किया है। मैं नीचे दिए गए इंजेक्शन पैटर्न का सुझाव दूंगा। हां, अधिक बॉयलर प्लेट कोड इसलिए यह "सुंदर" नहीं दिखता है, लेकिन यह सुनिश्चित करता है कि आपका कोड मॉड्यूलर है ... यदि आप अपनी अंतिम परियोजना चाहते हैं, तो कुछ ऐसा करेंगे;)
सीनू

यह IMHO परिस्थितियों पर निर्भर करता है। हां, वैश्विक संस्करण आम तौर पर एक अच्छा अभ्यास नहीं है (जैसा कि मैंने अपने जवाब में कहा था) और खरोंच से शुरू होने पर, मैं कहूंगा कि सब कुछ अलग मॉड्यूल में व्यवस्थित करें। लेकिन अगर आप मौजूदा कोड के साथ एकीकरण कर रहे हैं, तो अक्सर अन्य विचार होते हैं - यह सिर्फ एक (आसान, अभी तक खतरनाक) समाधान होता है।
जेसी फुल्टन

2
क्या कोई समझा सकता है कि यह जावास्क्रिप्ट के शब्दार्थ के संदर्भ में क्यों काम करता है? किस दायरे appसे जुड़ा है?
अली

मुझे नहीं लगता कि इस उत्तर को correctएक के रूप में चिह्नित किया जाना चाहिए ।
कोड कुकर

91

एक्सप्रेस ऑब्जेक्ट पर उपलब्ध "सेट" और "गेट" विधियों का उपयोग करके वास्तव में ऐसा करना बहुत आसान है।

उदाहरण इस प्रकार है, मान लें कि आपके पास कॉन्फ़िगरेशन से संबंधित एक चर है जो आपके कॉन्फ़िगरेशन से संबंधित सामान के साथ है जिसे आप अन्य स्थानों पर उपलब्ध होना चाहते हैं:

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
देर से आने वालों के लिए: app.configure को एक्सप्रेस 4.x
zamil

अच्छा है, req.app.get('name')एक आकर्षण की तरह काम करता है। यह संपत्ति एक्सप्रेस एप्लिकेशन के उदाहरण का संदर्भ रखती है जो मिडलवेयर का उपयोग कर रहा है। expressjs.com/pt-br/api.html#req.app
Lazaro फर्नांडीस लीमा सुलेमान

57

ऐसा करने का एक साफ तरीका app.localsहै एक्सप्रेस द्वारा प्रदान किया गया उपयोग करना । यहाँ प्रलेखन है।

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

1
मैंने http सेवाओं का पता लगाने और यूनिट परीक्षणों में आसानी से ओवरराइड करने के लिए इस पद्धति का उपयोग किया।
एलेक्स

28

वैश्विक चर घोषित करने के लिए आपको वैश्विक वस्तु का उपयोग करने की आवश्यकता होती है । वैश्विक की तरह। आपका नामकरणीय नाम। लेकिन यह एक सच्चा तरीका नहीं है। मॉड्यूल के बीच चर साझा करने के लिए इंजेक्शन शैली का उपयोग करने का प्रयास करें

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

तो आप नोड मॉड्यूल के एक सेट के साथ काम कर रहे हैं, शायद Express.js की तरह एक फ्रेमवर्क, और अचानक कुछ चर वैश्विक बनाने की आवश्यकता महसूस होती है। आप Node.js में वैरिएबल को वैश्विक कैसे बनाते हैं?

इसके लिए सबसे आम सलाह यह है कि या तो "वेरिएबल के बिना वैरिएबल घोषित करें" या "वैरिएबल को ग्लोबल ऑब्जेक्ट में जोड़ें" या "वैरिएबल को ग्लोबल ऑब्जेक्ट में जोड़ें"। आप कौन सा इस्तेमाल करते हैं?

सबसे पहले, आइए वैश्विक वस्तु का विश्लेषण करें। एक टर्मिनल खोलें, एक नोड आरईपीएल (शीघ्र) शुरू करें।

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

1
एक्सप्रेस में - सामान्य रूप से जैश या लाइनिंग का उपयोग करते समय - यह एक समस्या बन जाती है।
स्टीवन वेंटिमिग्लिया

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


मार्गों / index.js

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

महान टिप। मैं इसे करने की आवश्यकता ('./ myroutes') (ऐप) विधि से आगे बढ़ा और 10 मिनट तक मेरे सिर को एक दीवार से टकराया, जिससे यह पता लगाने की कोशिश की गई कि मेरे किसी भी मार्ग ने काम क्यों नहीं किया। एक समारोह ब्लॉक से बाहर myroutes.js में मार्ग विनिर्देशों लेने के लिए मत भूलना। रवींद्र!
ग्रैग

2

जैसा कि अन्य पहले ही साझा कर चुके हैं, इसके app.set('config', config)लिए बहुत अच्छा है। मैं बस कुछ ऐसे चीज़ों को जोड़ना चाहता था जो मुझे मौजूदा उत्तरों में नहीं दिखे, जो काफी महत्वपूर्ण हैं। Node.js का उदाहरण सभी अनुरोधों के बीच साझा किया जाता है, इसलिए जब यह कुछ 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()

0

जॉन गॉर्डन का उत्तर उन दर्जनों, कई साइटों से, जिन्हें मैंने वास्तव में काम किया था, में से आधा दर्जन समझाया / प्रलेखित उत्तरों में से पहला था। थैंक यू मिस्टर गॉर्डन। क्षमा करें, मेरे पास आपके उत्तर को टिक करने के लिए अंक नहीं हैं।

मैं नोड-रूट-फाइल-स्प्लिटिंग के लिए अन्य न्यूबियों के लिए जोड़ना चाहूंगा, कि 'इंडेक्स' के लिए अनाम फ़ंक्शन का उपयोग वह है जो अधिक बार देखा जाएगा, इसलिए मुख्य रूप से जॉन के उदाहरण का उपयोग करते हुए, कार्यात्मक रूप से- समान कोड एक सामान्य रूप से मिलेगा:

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

0

मैंने app.all का इस्तेमाल किया

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


0

यह बहुत आसान बात है, लेकिन लोगों के जवाब एक ही समय में भ्रमित और जटिल हैं।

मुझे दिखाते हैं कि आप अपने 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रूट से ऊपर की तरह आप जिस डेटा तक पहुंच रहे हैं, वह पहले सेट किया गया है।

यह है कि आप इस काम को कैसे प्राप्त कर सकते हैं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.