11 ответов:
чтобы сделать глобальную переменную, просто объявите ее без
varключевое слово. (Вообще говоря, это не лучшая практика, но в некоторых случаях это может быть полезно - просто будьте осторожны, поскольку это сделает переменную доступной везде.)вот пример visionmedia/скриншот-приложение
file приложение.js:
/** * Module dependencies. */ var express = require('express') , stylus = require('stylus') , redis = require('redis') , http = require('http'); app = express(); //... require() route filesfile маршруты/главная.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'); }); //...
это на самом деле очень легко сделать, используя методы "set" и "get", доступные на экспресс-объекте.
пример следующим образом, скажем, у вас есть переменная с именем config с вашим конфигурационным материалом, который вы хотите иметь в других местах:
в приложение.js:
var config = require('./config'); app.configure(function() { ... app.set('config', config); ... }в маршрутах / индексе.js
exports.index = function(req, res){ var config = req.app.get('config'); // config is now available ... }
чтобы объявить глобальную переменную, вам нужно использовать глобальные
аккуратный способ сделать это-использовать
app.localsпредоставлено самим Express. здесь документация.// 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; }
вот объясните хорошо, короче:
http://www.hacksparrow.com/global-variables-in-node-js.html
таким образом, вы работаете с набором модулей узлов, возможно, фреймворк, как Express.js, и вдруг чувствую необходимость сделать некоторые переменные глобальными. Как сделать переменные глобальными в узле.Джей?
наиболее распространенный совет для этого-либо "объявить переменную без ключевого слова var", либо "добавить переменную в глобальный объект", либо "добавьте переменную в глобальный объект". Какой из них вы используете?
во-первых, давайте проанализируем глобальный объект. Откройте терминал, запустите узел 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'
это был полезный вопрос, но может быть более того, давая фактические примеры кода. Даже связанная статья фактически не показывает реализацию. Поэтому я смиренно:
в своем
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');приложение.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
мой предпочтительный способ-использовать циклические зависимости*, который узел поддерживает
- в приложение.js define
var app = module.exports = express();как ваш первый заказ бизнеса- теперь любой модуль требуется после того, как факт может
var app = require('./app')чтобы получить к нему доступ
приложение.jsvar 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
индекс, маршруты/.jsvar 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)идеально подходит для этого. Я просто хотел добавить что-то, что я не видел в существующих ответах, что очень важно. узел.экземпляр 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ваше сообщение будет "Добро пожаловать в фу!". Это глупый пример, но он получает точку зрения.есть несколько интересных моментов об этом в почему разные узлы.сеансы js разделяют переменные?.
ответ Джона Гордона был первым из десятков полуобъясненных / документированных ответов, которые я пробовал, со многих, многих сайтов, которые действительно работали. Спасибо, Мистер Гордон. Извините, у меня нет очков, чтобы поставить галочку в вашем ответе.
Я хотел бы добавить, для других новичков в Node-route-file-splitting, что использование анонимной функции для "индекса" - это то, что вы будете чаще видеть, поэтому используйте пример Джона для main.js, функционально эквивалентный код, который обычно можно найти это:
app.get('/',(req, res) { res.render('index', { title: 'Express' }); });
приложение.метод 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');
я решил такую же проблему, но мне пришлось написать больше кода. Я создал
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 }в главном файле, bootstrap оба.
app.js require('./server').startServer(7000) require('./web/help').registerHelp()
Comments