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 сказали:
Из вашего собственного представления,
c_controller
не известно Вы должны были бы либоrequire
это в модуле представления или даже в самой функции представления. Вы могли бы также передать это классу представления, но я это усложняю и предпочитаю требовать.Что сказал @Linus - подумайте об экспорте всего объекта (не только функции) или используйте
bind
иначе.
Так как вы используете this
внутри ваших функций в c_controller
и затем вы назначаете только функции для объекта экспорта, ваши функции будут ссылаться export
когда ты пишешь this
и не c_controller
,
Я думаю, что лучший способ исправить это экспортировать весь c_controller
объект, как это:
module.exports = exports = c_controller;
Если вы хотите styles
, script
а также view
скрытые переменные вы можете:
- использование
c_controller
вместоthis
- Привязать функции перед их экспортом, вот так:
exports.add_style = c_controller.add_style.bind(c_controller)