2014-09-02 5 views
0

У меня возникли проблемы с этим сценариемПроблема при маршрутизации страницы

// App.js (shrink) 

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

app.get('/', controller.index); 

app.get('/home', controller.home); 

// /controller/index.js 

var meta = { 

    title: 'index', 
    description: '' 
} 

exports.index = function(req,res){ 

    res.render('index', { 

     meta: meta 
    }); 
} 

// /controller/home.js 

var meta = { 

    title: 'glibet', 
    description: '' 
} 

exports.home = function(req,res){ 

    res.render('home', { 

     meta: meta 
    }); 
} 

его возвращение мне эту ошибку: «Ошибка: Route.get() требует функции обратного вызова, но есть [объект Не определено]»

Как ни странно, он работает нормально, если я даю app.get ('/', controller.index); в одиночку без дома маршрута

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

PS: Я пытаюсь избежать установки переменной в каждый файл контроллера, избегая чего-то подобного этому коду;

var homeController = require('./controllers/home'); 
var userController = require('./controllers/user'); 

app.get('/', homeController.index); 
app.get('/login', userController.getLogin); 

ответ

0

Когда вам требуется ./controller, узел сначала ищет файл с именем controller. В противном случае он ищет файл с именем index.js в каталоге controller.

Вы не нуждаетесь в каждом файле в каталоге, используя require() таким образом.

Для этой цели вы можете использовать плагин, такой как require-dir. Тем не менее, моя рекомендация заключалась бы в том, чтобы требовать каждый файл отдельно, чтобы вы точно знали, что вы делаете на своей странице, - это предотвращает побочные эффекты, когда вы случайно оставляете файл в своем каталоге маршрутов, который вам не нужен, главный контроллер приложения.

+0

Спасибо, но ваши рекомендации не помогают с тем, что я пытаюсь достичь. Это способ избежать установки переменной для каждого файла контроллера. – 2014-09-02 19:56:51

+0

Обычно я обрабатываю это, чтобы передать 'app' в функцию, которую я' require'ing. Итак, 'require ('./ routes/foo') (app);' и затем вызывать 'app.get()' внутри моих отдельных файлов маршрутов. – Interrobang

+0

Вы могли бы объяснить немного больше? Я начинаю изучать javascript, и я не совсем понимаю, что (приложение) делает в вашем коде. – 2014-09-02 22:25:50

0

Вы пытаетесь создать каталог js-файлов в качестве объекта require. Если вы хотите сохранить все файлы контроллеров отдельно, но они представлены в одном объекте в вашем приложении, вы могли бы сделать что-то вроде этого:

// /controller/controllers.js 

var home = require('./home'); 
var index = require('./index'); 
module.exports = { 
    home: home.home,  
    index: index.index 
} 

Требуя»./controller/controllers' вы можете сохранить все конечные точки контроллера, организованные в разных файлах, доступные в одном объекте.

+0

Спасибо! Ваш ответ решит мою проблему, но я задаюсь вопросом, есть ли более простой/простой способ сделать это. – 2014-09-02 20:03:41

+0

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

Смежные вопросы