Node / Express, включая пользовательские модули

В настоящее время я использую Express с узлом, и у меня возникает проблема при попытке использовать пользовательский модуль из одной из моих функций маршрутизации. Вот что у меня так далеко.

В моем файле app.js мне нужен такой модуль.

c_controller = require( './core/c_controller' );

Я знаю, что это требуется правильно, потому что я консоль вышла из системы, и он показывает нормально.

Модуль c_controller выглядит следующим образом.

var c_controller = {

styles: [],
script: '',
view: ''
};

c_controller.add_style = function( style ) {

    this.styles.push( style );

    return this;
},

c_controller.set_script = function( script ) {

    this.script = script;

    return this;
},

c_controller.set_view = function( view ) {

    this.view = view;

    return this;
},

c_controller.render = function() {

    return { script: this.script,
             styles: this.styles,
             view: this.view };
}

exports.add_style = c_controller.add_style;
exports.set_script = c_controller.set_script;
exports.set_view = c_controller.set_view;
exports.render = c_controller.render;

Появляется ошибка 500 ReferenceError: c_controller не определен.

Теперь я не уверен, должен ли я передавать объект c_controller в мои функции маршрутизации, так или иначе я не уверен, как это сделать.

Я любой мог бы объяснить это мне, чтобы прояснить, что было бы здорово.

Заранее спасибо.

ОБНОВИТЬ

Вот код, который использует c_controller

/*
 * GET home page.
 */
exports.index = function(req, res){

    c_controller.set_view( 'index' );

    res.render( 'includes/overall_template', { c_controller.render() } );
};

Теперь, если мне потребуется c_controller непосредственно в маршрут, он работает. Я бы предпочел только модуль в основном файле приложения, поэтому мне не придется делать это на каждом маршруте. Кто-нибудь знает возможно ли это??

2 ответа

Решение

Чтобы попытаться обобщить все комментарии и то, что вы сами @DavidJones сказали:

  1. Из вашего собственного представления, c_controller не известно Вы должны были бы либо require это в модуле представления или даже в самой функции представления. Вы могли бы также передать это классу представления, но я это усложняю и предпочитаю требовать.

  2. Что сказал @Linus - подумайте об экспорте всего объекта (не только функции) или используйте bind иначе.

Так как вы используете this внутри ваших функций в c_controller и затем вы назначаете только функции для объекта экспорта, ваши функции будут ссылаться export когда ты пишешь this и не c_controller,

Я думаю, что лучший способ исправить это экспортировать весь c_controller объект, как это:

module.exports = exports = c_controller;

Если вы хотите styles, script а также view скрытые переменные вы можете:

  1. использование c_controller вместо this
  2. Привязать функции перед их экспортом, вот так: exports.add_style = c_controller.add_style.bind(c_controller)
Другие вопросы по тегам