2016-01-29 6 views
1

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

Мои маршруты экспортируются по express.Router(). На этих маршрутах я хотел бы импортировать запрошенные значения из моего приложения app.js для отображения с помощью шаблонов.

Как я мог бы самым простым способом сохранить вещи, скажем, с помощью app.locals или req.variableName?

Поскольку маршрут с использованием express.Router() связывает его вместе с app.js, следует ли использовать app.params() и как-то сделать эти значения доступными?

Использование глобалов кажется худшей идеей, так как я расширяю приложение. Я не уверен, что лучшая практика будет экономить значения в среду процесса либо с помощью app.locals.valueKey = key.someValue ...

Большого спасибо заранее никому

+0

вы должны добавить module.exports = "то, что вы хотите вернуть из этого модуля (файл js)" –

+0

Спасибо, но это не совсем тот ответ, который я искал. Я использовал module.exports для всех моих моделей данных с MongoDB/Mongoose и маршрутов, которые используют express.Router(). Затем требуйте() их в главном app.js. Однако у меня есть некоторые ключи ценности, которые я хочу сделать доступными на маршрутах. Я не могу ссылаться на мой основной app.js/объект, который я пытался экспортировать на маршруты. – DarkCodeWiz

+0

попробуйте этот http://stackoverflow.com/questions/20712712/how-to-pass-variable-from-app-js-to-routes-index-js –

ответ

0

Если я правильно понял вопрос правильно, вы хотите, чтобы передать значение более позднее промежуточного слоя:

app.js:

// Let's say it's like this in this example 

var express = require('express'); 
var app = express(); 

app.use(function (req, res, next) { 
    var user = User.findOne({ email: 'someValue' }, function (err, user) { 
     // Returning a document with the keys I'm interested in 
     req.user = { key1: value1, key2: value2... }; // add the user to the request object 
     next(); // tell express to execute the next middleware 
    }); 
}); 

// Here I include the route 
require('./routes/public.js')(app); // I would recommend passing in the app object 

/routes/public.js:

module.export = function(app) { 
    app.get('/', function(req, res) { 
     // Serving Home Page (where I want to pass in the values) 
     router.get('/', function (req, res) { 
      // Passing in the values for Swig to render 
      var user = req.user; // this is the object you set in the earlier middleware (in app.js) 
      res.render('index.html', { pagename: user.key2, ... }); 
     }); 
    }); 
}); 
+0

Благодарим вас за предложение @forrert. Кажется, я ближе к ответу. Ядро моей проблемы заключается в том, что я не хочу делать ненужные запросы снова в моих включенных маршрутах, когда я могу сказать, что хранить все запрошенные ключи в объекте и импортировать его. – DarkCodeWiz

+0

Если вам не нужно выполнять запрос в app.js (Contents.findOne ({url: siteRequest}, ...)) только один раз в течение всего срока действия вашего приложения (например, в начале приложения), я бы все равно рекомендуется добавлять ключи и значения в объект req для использования в более позднем промежуточном программном обеспечении. Я также рекомендую перечислить руководство по промежуточному программному обеспечению на веб-сайте express.js: http://expressjs.com/ru/guide/writing-middleware.html – forrert

+0

Благодарим вас за ссылку о промежуточном программном обеспечении в целом. Да Мне нужно выполнить запрос только один раз в app.js, так как мне нужно первое значение, а затем его связанные значения в маршрутах, не делая другого запроса. – DarkCodeWiz