मैं एक चर कैसे सेट करूं app.js
और क्या यह सभी मार्गों में उपलब्ध है, मार्गों में index.js
स्थित फ़ाइल में कम से कम । एक्सप्रेस ढांचे का उपयोग कर औरnode.js
जवाबों:
एक वैश्विक चर बनाने के लिए, बस इसे 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');
});
//...
app
से जुड़ा है?
correct
एक के रूप में चिह्नित किया जाना चाहिए ।
एक्सप्रेस ऑब्जेक्ट पर उपलब्ध "सेट" और "गेट" विधियों का उपयोग करके वास्तव में ऐसा करना बहुत आसान है।
उदाहरण इस प्रकार है, मान लें कि आपके पास कॉन्फ़िगरेशन से संबंधित एक चर है जो आपके कॉन्फ़िगरेशन से संबंधित सामान के साथ है जिसे आप अन्य स्थानों पर उपलब्ध होना चाहते हैं:
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
है एक्सप्रेस द्वारा प्रदान किया गया उपयोग करना ।
यहाँ प्रलेखन है।
// 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;
}
वैश्विक चर घोषित करने के लिए आपको वैश्विक वस्तु का उपयोग करने की आवश्यकता होती है । वैश्विक की तरह। आपका नामकरणीय नाम। लेकिन यह एक सच्चा तरीका नहीं है। मॉड्यूल के बीच चर साझा करने के लिए इंजेक्शन शैली का उपयोग करने का प्रयास करें
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
तो आप नोड मॉड्यूल के एक सेट के साथ काम कर रहे हैं, शायद 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'
सबसे आसान तरीका है कि आप जल्द ही अपने ऐप में एक वैश्विक वैरिएबल घोषित करें।
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)
लिए बहुत अच्छा है। मैं बस कुछ ऐसे चीज़ों को जोड़ना चाहता था जो मुझे मौजूदा उत्तरों में नहीं दिखे, जो काफी महत्वपूर्ण हैं। 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
, तो आपका संदेश "फू में आपका स्वागत है!" होगा। यह एक मूर्खतापूर्ण उदाहरण है, लेकिन यह इस बिंदु को पार करता है।
इस बारे में कुछ दिलचस्प बिंदु हैं कि अलग-अलग नोड क्यों हैं। सत्र सत्र चर साझा करते हैं? ।
मैंने उसी समस्या को हल किया, लेकिन मुझे अधिक कोड लिखना पड़ा। मैंने एक 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()
जॉन गॉर्डन का उत्तर उन दर्जनों, कई साइटों से, जिन्हें मैंने वास्तव में काम किया था, में से आधा दर्जन समझाया / प्रलेखित उत्तरों में से पहला था। थैंक यू मिस्टर गॉर्डन। क्षमा करें, मेरे पास आपके उत्तर को टिक करने के लिए अंक नहीं हैं।
मैं नोड-रूट-फाइल-स्प्लिटिंग के लिए अन्य न्यूबियों के लिए जोड़ना चाहूंगा, कि 'इंडेक्स' के लिए अनाम फ़ंक्शन का उपयोग वह है जो अधिक बार देखा जाएगा, इसलिए मुख्य रूप से जॉन के उदाहरण का उपयोग करते हुए, कार्यात्मक रूप से- समान कोड एक सामान्य रूप से मिलेगा:
app.get('/',(req, res) {
res.render('index', { title: 'Express' });
});
मैंने 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');
यह बहुत आसान बात है, लेकिन लोगों के जवाब एक ही समय में भ्रमित और जटिल हैं।
मुझे दिखाते हैं कि आप अपने 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
रूट से ऊपर की तरह आप जिस डेटा तक पहुंच रहे हैं, वह पहले सेट किया गया है।
यह है कि आप इस काम को कैसे प्राप्त कर सकते हैं!
req.app.locals
।