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



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

772   11  

11 ответов:

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

вот пример visionmedia/скриншот-приложение

file приложение.js:

/**
 * Module dependencies.
 */

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

app = express();

//... require() route files

file маршруты/главная.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') чтобы получить к нему доступ


приложение.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


индекс, маршруты/.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');

как другие уже поделились, 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

    Ничего не найдено.