Подтвердить что ты не робот

Глобальная переменная в app.js доступна на маршрутах?

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

4b9b3361

Ответ 1

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

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

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

//...

Ответ 2

На самом деле это очень просто сделать, используя доступные методы "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
  ...
}

Ответ 3

Чтобы объявить глобальную переменную, вам нужно использовать global. Как global.yourVariableName. Но это неправда. Для обмена переменными между модулями старайтесь использовать стиль впрыска, например

someModule.js:

module.exports = function(injectedVariable) {
    return {
        somePublicMethod: function() {
        },
        anotherPublicMethod: function() {
        },
    };
};

app.js

var someModule = require('./someModule')(someSharedVariable);

Или вы можете использовать суррогатный объект для этого. Как hub.

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

Ответ 4

Оптимальный способ сделать это - использовать 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;
}

Ответ 5

Вкратце объясните:

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

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

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

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

Ответ 6

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

В вашем файле 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

Ответ 7

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

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

Ответ 8

Как уже сообщали другие, 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 совместно используют переменные?.

Ответ 9

Ответ Джона Гордона был первым из десятков наполовину объясненных/задокументированных ответов, которые я пробовал из многих, многих сайтов, которые действительно работали. Благодарю вас, мистер Гордон. Извините, у меня нет очков, чтобы увеличить ваш ответ.

Я хотел бы добавить для других новичков node -route-file-splitting, что использование анонимной функции для "индекса" - это то, что чаще видят, так что пример Джона для основного. js, функционально эквивалентный код, который обычно находил бы:

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

Ответ 10

Я использовал app.all

Метод app.all() полезен для сопоставления глобальной логики для конкретных префиксы пути или произвольные совпадения.

В моем случае я использую confit для управления конфигурацией,

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

Ответ 11

Я решил ту же проблему, но мне пришлось написать больше кода. Я создал файл 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()