Глобальная переменная в app.js доступна в маршрутах? - PullRequest
74 голосов
/ 19 марта 2012

Как установить переменную в app.js и сделать ее доступной во всех маршрутах, по крайней мере в файле index.js, расположенном в маршрутах.используя экспресс-фреймворк и node.js

Ответы [ 12 ]

76 голосов
/ 15 января 2014

На самом деле это очень легко сделать, используя методы "set" и "get", доступные для экспресс-объекта.

В следующем примере, скажем, у вас есть переменная config с вашими настройками, которые вы хотите быть доступными в других местах:

В app.js:

var config = require('./config');

app.configure(function() {
  ...
  app.set('config', config); 
  ...
}

В маршрутах / index.js

exports.index = function(req, res){
  var config = req.app.get('config');
  // config is now available
  ...
}
57 голосов
/ 19 марта 2012

Чтобы создать глобальную переменную, просто объявите ее без ключевого слова var.(Вообще говоря, это не лучшая практика, но в некоторых случаях это может быть полезно - просто будьте осторожны, поскольку это сделает переменную доступной везде.)

Вот пример из visionmedia / screenshot-app

файл app.js :

/**
 * Module dependencies.
 */

var express = require('express')
  , stylus = require('stylus')
  , redis = require('redis')
  , http = require('http');

app = express();

//... require() route files

файл routs / 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');
});

//...
38 голосов
/ 08 февраля 2016

Хороший способ сделать это - использовать 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;
}
28 голосов
/ 19 марта 2012

Чтобы объявить глобальную переменную, вам нужно использовать global object. Как 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 голосов
/ 15 марта 2013

Вот объясни хорошо, короче:

http://www.hacksparrow.com/global-variables-in-node-js.html

Итак, вы работаете с набором модулей Node, может быть, с фреймворком вроде Express.js, и вдруг почувствуете необходимость сделать некоторые переменные глобальными. Как сделать переменные глобальными в Node.js?

Наиболее распространенный совет для этого - либо «объявить переменную без ключевого слова var», либо «добавить переменную в глобальный объект», либо «добавить переменную в объект GLOBAL». Какой из них вы используете?

Прежде всего, давайте проанализируем глобальный объект. Откройте терминал, запустите узел 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'
4 голосов
/ 30 июля 2012

Это был полезный вопрос, но его можно было бы привести, приведя примеры кода.Даже связанная статья на самом деле не показывает реализацию.Поэтому я смиренно отправляю:

В вашем файле 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
3 голосов
/ 26 марта 2014

Мой предпочтительный способ - использовать циклические зависимости *, которые поддерживает узел

  • в 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');
2 голосов
/ 08 февраля 2019

Самый простой способ - объявить глобальную переменную в вашем app.js, в начале:

global.mySpecialVariable = "something"

тогда по любым маршрутам можно его получить:

console.log(mySpecialVariable)
2 голосов
/ 11 июля 2014

Поскольку другие уже поделились, 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, ваше сообщение будет «Добро пожаловать в foo!». Это глупый пример, но в нем есть смысл.

Есть несколько интересных моментов по этому поводу на Почему разные сессии node.js совместно используют переменные? .

0 голосов
/ 01 октября 2017

Я решил ту же проблему, но мне пришлось написать больше кода.Я создал 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...