Вопрос по express, node.js – Express: как передать экземпляр приложения в маршруты из другого файла?

95

Я хочу разделить мои маршруты на разные файлы, где один файл содержит все маршруты, а другой - соответствующие действия. В настоящее время у меня есть решение для достижения этой цели, однако мне нужно сделать экземпляр приложения глобальным, чтобы иметь возможность доступа к нему в действиях. Моя текущая настройка выглядит так:

app.js:

var express   = require('express');
var app       = express.createServer();
var routes    = require('./routes');

var controllers = require('./controllers');
routes.setup(app, controllers);

app.listen(3000, function() {
  console.log('Application is listening on port 3000');
});

routes.js:

exports.setup = function(app, controllers) {

  app.get('/', controllers.index);
  app.get('/posts', controllers.posts.index);
  app.get('/posts/:post', controllers.posts.show);
  // etc.

};

Контроллеры / index.js:

exports.posts = require('./posts');

exports.index = function(req, res) {
  // code
};

Контроллеры / posts.js:

exports.index = function(req, res) {
  // code
};

exports.show = function(req, res) {
  // code
};

Однако эта настройка имеет большую проблему: у меня есть база данных и экземпляр приложения, которые мне нужно передать действиям (controllers / *. Js). Единственный вариант, который я могу придумать, - сделать обе переменные глобальными, что на самом деле не является решением. Я хочу отделить маршруты от действий, потому что у меня много маршрутов и я хочу, чтобы они были в центре.

Какой лучший способ передать переменные в действия, но отделить действия от маршрутов?

Как выглядит ваш controllers.js? Может быть, вы можете сделать это функцией (вместо объекта), которая может получать параметры. mihai
require ("controllers") требует controllers / index.js. Однако функция не будет работать, потому что я использую объект в маршрутах (см. Route.js) и, таким образом, не могу передать ему аргументы, даже если это функция. Claudio Albertin

Ваш Ответ

6   ответов
0

который будет выполнять всю работу с БД с простым API и избегать общего состояния.

Разделение route.setup выглядит как накладные расходы. Я бы предпочел вместо этого разместить маршрутизацию на основе конфигурации. И настройте маршруты в .json или с аннотациями.

Error: User Rate Limit Exceeded Claudio Albertin
Error: User Rate Limit Exceeded Claudio Albertin
155

использованиеreq.app, req.app.get('somekey')

Переменная приложения, созданная путем вызоваexpress() устанавливается для объектов запроса и ответа.

Увидеть:https://github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededapp.set('somekey', {})Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededapp.route('/something').get(app.locals.authorized,function(req,res,next){});Error: User Rate Limit Exceeded
4

Или просто сделай это:

var app = req.app

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

router.use( (req,res,next) => {
    app = req.app;
    next();
});
Error: User Rate Limit Exceededapp.use('my-service', serviceInstance)Error: User Rate Limit Exceededreq.app.get('my-service')Error: User Rate Limit Exceeded
0

Допустим, у вас есть папка с именем «контроллеры».

В вашем app.js вы можете поместить этот код:

console.log("Loading controllers....");
var controllers = {};

var controllers_path = process.cwd() + '/controllers'

fs.readdirSync(controllers_path).forEach(function (file) {
    if (file.indexOf('.js') != -1) {
        controllers[file.split('.')[0]] = require(controllers_path + '/' + file)
    }
});

console.log("Controllers loaded..............[ok]");

... а также ...

router.get('/ping', controllers.ping.pinging);

в ваших контроллерах forlder у вас будет файл & quot; ping.js & quot; с этим кодом:

exports.pinging = function(req, res, next){
    console.log("ping ...");
}

И это все ....

92

Node.js supports circular dependencies.
Использование циклических зависимостей вместо require ('a.. Routs') (app) очищает большую часть кода и делает каждый модуль менее зависимым от своего загрузочного файла:


app.js

var app = module.exports = express(); //now app.js can be required to bring app into any file

//some app/middleware 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');


-----04/2014 update-----
Express 4.0 исправил сценарий использования для определения маршрутов, добавив метод express.router ()!
документация -http://expressjs.com/4x/api.html#router

Пример из их нового генератора:
Написание маршрута:
https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
Добавление / размещение имен в приложении: https://github.com/expressjs/generator/blob/master/templates/js/app.js#L24

Существуют варианты использования для доступа к приложению из других ресурсов, поэтому циклические зависимости по-прежнему являются допустимым решением.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededappError: User Rate Limit Exceeded
Error: User Rate Limit Exceededapp.jsError: User Rate Limit ExceededafterError: User Rate Limit Exceededrequire()Error: User Rate Limit Exceededhow they work!
Error: User Rate Limit ExceededfilepathError: User Rate Limit Exceeded
26

Как я уже говорил в комментариях, вы можете использовать функцию в качестве module.exports. Функция также является объектом, поэтому вам не нужно менять синтаксис.

app.js

var controllers = require('./controllers')({app: app});

controllers.js

module.exports = function(params)
{
    return require('controllers/index')(params);
}

Контроллеры / index.js

function controllers(params)
{
  var app = params.app;

  controllers.posts = require('./posts');

  controllers.index = function(req, res) {
    // code
  };
}

module.exports = controllers;
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededcontrollersError: User Rate Limit Exceededjsfiddle.net/mihaifm/yV79K
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Claudio Albertin
Error: User Rate Limit Exceeded Claudio Albertin

Похожие вопросы