Bir değişkeni nasıl ayarlayabilirim app.jsve en azından index.jsrotalarda bulunan dosyada tüm rotalarda kullanılabilir olmasını nasıl sağlayabilirim ? ekspres çerçeveyi kullanarak venode.js
Yanıtlar:
Global bir değişken oluşturmak için, onu varanahtar kelime olmadan bildirmeniz yeterlidir. (Genel olarak konuşursak, bu en iyi uygulama değildir, ancak bazı durumlarda faydalı olabilir - değişkeni her yerde kullanılabilir hale getireceği için dikkatli olun.)
İşte visionmedia / screenshot-app'den bir örnek
app.js dosyası :
/**
* Module dependencies.
*/
var express = require('express')
, stylus = require('stylus')
, redis = require('redis')
, http = require('http');
app = express();
//... require() route files
dosya yolları / 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');
});
//...
appilişkilendirilir?
correcttek olarak işaretlenmesi gerektiğini sanmıyorum .
Bunu ekspres nesnede bulunan "set" ve "get" yöntemlerini kullanarak yapmak aslında çok kolaydır.
Aşağıdaki gibi bir örnek, başka yerlerde olmasını istediğiniz konfigürasyonla ilgili öğelerinizle birlikte config adlı bir değişkeniniz olduğunu varsayalım:
App.js'de:
var config = require('./config');
app.configure(function() {
...
app.set('config', config);
...
}
Rotalarda / index.js'de
exports.index = function(req, res){
var config = req.app.get('config');
// config is now available
...
}
req.app.get('name')bir cazibe gibi çalışıyor. Bu özellik, ara yazılımı kullanan Express uygulamasının örneğine bir başvuru içerir. expressjs.com/pt-br/api.html#req.app
Bunu yapmanın düzgün bir yolu, app.localsExpress tarafından sağlanan kullanımıdır .
İşte belgeler.
// 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 bir değişkeni bildirmek için global nesneyi kullanmanız gerekir . Global.yourVariableName gibi. Ama bu doğru bir yol değil. Değişkenleri modüller arasında paylaşmak için enjeksiyon stilini kullanmayı deneyin.
someModule.js:
module.exports = function(injectedVariable) {
return {
somePublicMethod: function() {
},
anotherPublicMethod: function() {
},
};
};
app.js
var someModule = require('./someModule')(someSharedVariable);
Ya da bunu yapmak için vekil nesne kullanabilirsiniz. Gibi göbek .
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');
İşte kısaca iyi açıklayın:
http://www.hacksparrow.com/global-variables-in-node-js.html
Yani bir dizi Node modülüyle, belki Express.js gibi bir çerçeveyle çalışıyorsunuz ve aniden bazı değişkenleri global hale getirme ihtiyacını hissediyorsunuz. Node.js'de değişkenleri nasıl global yaparsınız?
Bunun için en yaygın tavsiye, "değişkeni var anahtar sözcüğü olmadan bildirmek" veya "değişkeni global nesneye eklemek" veya "değişkeni GLOBAL nesnesine eklemek" dir. Hangisini kullanıyorsun?
Öncelikle global nesneyi inceleyelim. Bir terminal açın, bir Düğüm REPL (komut istemi) başlatın.
> 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'
en kolay yol, erken dönemde app.js'nizde global bir değişken bildirmektir:
global.mySpecialVariable = "something"
daha sonra herhangi bir rotada alabilirsiniz:
console.log(mySpecialVariable)
Bu yararlı bir soruydu, ancak gerçek kod örnekleri vererek daha da zor olabilirdi. Bağlantılı makale bile aslında bir uygulama göstermiyor. Bu nedenle, alçakgönüllülükle sunuyorum:
Senin içinde app.jsdosyanın, dosyanın üst:
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, yönteme herhangi bir referans içermez app.get(). Bunları ayrı yol dosyalarında tanımlanmaya bırakın.
routes/index.js:
require('./main');
require('./users');
ve son olarak, gerçek bir rota dosyası 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
Tercih ettiğim yöntem, düğümün desteklediği döngüsel bağımlılıkları * kullanmaktır
var app = module.exports = express();ilk iş siparişiniz olarak tanımlayınvar app = require('./app')erişebilmek için gerekli olan herhangi bir modülvar 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');
Başkalarının zaten paylaştığı gibi, app.set('config', config)bunun için harika. Sadece mevcut cevaplarda görmediğim oldukça önemli bir şey eklemek istedim. Bir Node.js örneği tüm isteklerde paylaşılır, bu nedenle bazılarının configveya routernesnelerin küresel olarak paylaşılması çok pratik olsa da , çalışma zamanı verilerinin küresel olarak depolanması istekler ve kullanıcılar arasında kullanılabilir olacaktır . Şu çok basit örneği düşünün:
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);
Ziyaret ederseniz /barve başka bir istek isabet ederse /foo, mesajınız "Foo'ya hoş geldiniz!" Olacaktır. Bu aptalca bir örnek, ama asıl noktayı anlıyor.
Bununla ilgili bazı ilginç noktalar var: Neden farklı node.js oturumları değişkenleri paylaşıyor? .
Aynı sorunu çözdüm ama daha fazla kod yazmam gerekiyordu. server.jsYolları kaydetmek için ekspres kullanan bir dosya oluşturdum . registerDiğer modüller tarafından kendi rotalarını kaydetmek için kullanılabilecek bir işlevi ortaya çıkarır . Ayrıca startServerbir bağlantı noktasını dinlemeye başlamak için bir işlevi de ortaya çıkarır.
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
}
Başka bir modülde, bir rota oluşturmak için bu dosyayı kullanın.
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
}
Ana dosyada, her ikisini de önyükleyin.
app.js
require('./server').startServer(7000)
require('./web/help').registerHelp()
bu oldukça kolay bir şey, ancak insanların cevapları aynı zamanda kafa karıştırıcı ve karmaşık.
expressuygulamanızda global değişkeni nasıl ayarlayabileceğinizi size göstereyim . Böylece ona herhangi bir rotadan gerektiği gibi erişebilirsiniz.
Diyelim ki ana /rotanızdan global bir değişken ayarlamak istiyorsunuz
router.get('/', (req, res, next) => {
req.app.locals.somethingNew = "Hi setting new global var";
});
Böylece tüm rotalardan req.app alacaksınız. ve ardından localsglobal verileri içine ayarlamak için kullanmanız gerekecek . Yukarıdaki şov gibi, hepiniz hazırsınız. şimdi
size bu verileri nasıl kullanacağınızı göstereceğim
router.get('/register', (req, res, next) => {
console.log(req.app.locals.somethingNew);
});
registerVerilere eriştiğiniz rotadan yukarıdaki gibi daha önce ayarlanmış.
Bu şeyi bu şekilde çalıştırabilirsiniz!
John Gordon'un cevabı, pek çok siteden denediğim, gerçekten işe yarayan düzinelerce yarı açıklanmış / belgelenmiş cevaptan ilkiydi. Teşekkürler Bay Gordon. Maalesef cevabınızı yükseltecek puanım yok.
Düğüm-yol-dosya-bölmeye yeni başlayanlar için, 'dizin' için anonim işlevin kullanımının daha sık göreceğini, bu nedenle John'un main.js örneğini kullanarak, işlevsel olarak- normalde bulacağınız eşdeğer kod:
app.get('/',(req, res) {
res.render('index', { title: 'Express' });
});
App.all kullandım
App.all () yöntemi, belirli yol önekleri veya rastgele eşleşmeler için "global" mantığı eşlemek için kullanışlıdır.
Benim durumumda, konfigürasyon yönetimi için confit kullanıyorum ,
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();
});
});
Rotalarda yaparsın req.app.get('config').get('cookie');
req.app.locals.