0

我目前正在使用带有节点的 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 is not defined。

现在我不确定我是否必须将 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 直接进入它的工作路线。我宁愿只需要主应用程序文件中的模块,所以我不必在每条路线上都这样做。有谁知道这是否可能?

4

2 回答 2

1

由于您this在函数内部使用c_controller,然后仅将函数分配给导出对象,因此您的函数将export在您编写时引用this不是 c_controller.

我认为修复它的最佳方法是导出整个c_controller对象,如下所示:

module.exports = exports = c_controller;

如果您想隐藏styles,scriptview变量,您可以:

  1. 使用c_controller代替this
  2. 在导出函数之前绑定函数,如下所示:exports.add_style = c_controller.add_style.bind(c_controller)
于 2013-09-17T11:56:24.830 回答
0

尝试总结所有评论,以及您自己@DavidJones 所说的话:

  1. 从您的自定义视图中,c_controller是未知的。您必须require在视图的模块中甚至在视图函数本身中使用它。您也可以将它传递给视图类,但我使事情变得复杂,并且更喜欢要求。

  2. @Linus 所说的 - 考虑导出整个对象(不仅仅是函数),或者以bind其他方式使用。

于 2013-09-17T13:23:29.723 回答