我目前正在使用Express with node,当我尝试从我的一个路由功能中使用自定义模块时,我遇到了一个问题。这是我到目前为止所拥有的。
在我的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直接进入它的工作路线。我宁愿只需要主app文件中的模块,所以我不必在每个路径中都这样做。有谁知道这是否可能?
答案 0 :(得分:1)
由于您在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)
答案 1 :(得分:0)
尝试总结所有评论,以及@DavidJones所说的你自己:
在自定义视图中,c_controller
未知。您必须在视图的模块中require
或者甚至在视图函数本身中。您也可以将它传递给视图类,但是这使事情变得复杂,而且更喜欢要求。
@Linus所说的 - 考虑导出整个对象(不仅仅是函数),或者另外使用bind
。