Javascript 节点JS调用a";“本地”;module.exports中的函数

Javascript 节点JS调用a";“本地”;module.exports中的函数,javascript,node.js,model-view-controller,express,Javascript,Node.js,Model View Controller,Express,如何从module.exports声明中的另一个函数中调用函数 我有一个MVC结构节点js项目和一个名为TestController.js的控制器。我想访问控制器内的方法,但使用此关键字会产生以下错误: 无法调用未定义的方法getName 如何访问控制器中的方法?您可以通过模块访问getName函数。导出。像这样: "use strict" module.exports = { myName : function(req, res, next) { // accessin

如何从module.exports声明中的另一个函数中调用函数

我有一个MVC结构节点js项目和一个名为TestController.js的控制器。我想访问控制器内的方法,但使用
关键字会产生以下错误:

无法调用未定义的方法getName


如何访问控制器中的方法?

您可以通过
模块访问
getName
函数。导出
。像这样:

"use strict"
module.exports = {
    myName : function(req, res, next) {
        // accessing method within controller
        module.exports.getName(data);
    },

    getName : function(data) {
        // code
    }
}

也许你可以这样做。它减少了筑巢。所有导出都在文件末尾完成

"use strict";

var _getName = function() {
    return 'john';
};

var _myName = function() {
    return _getName();
};

module.exports = {
    getName : _getName,
    myName : _myName
};
我找到了解决办法:-)


如果要在本地和其他文件中使用该函数

function myFunc(){
    return 'got it'
}
module.exports.myFunc = myFunc;

我知道答案已经被接受了,但我觉得有必要在这个问题上多加两分

节点模块具有“单音”性质,在模块内部时,您就是模块。 在我看来,至少在设计模式方面,可以更清晰地访问内部模块方法,而不需要
this
self
的副本

使用
这个
,如果一个人碰巧发送了单独的方法,却忘记了使用
.bind
,可能会很危险

使用
self
的副本是多余的,我们已经在一个单例行为模块中了,既然可以避免,为什么还要保留对自己的引用呢

请考虑以下几点:

选择1 选择2 这与es6模块的工作原理相同:

方案1(ES6)

方案2(ES6)


同样,这只是一个观点,但它看起来更清晰,在不同的实现中更一致,并且没有使用一个
this
/
self

this的值取决于执行上下文,而不是函数的定义方式。
this.getName(data)
仍然可以工作,但是,分配命名约定是一个好主意。这种方法的另一个好处是函数可以相互引用(即
\u myName
可以调用
\u getName
),当然,我认为它也比其他解决方案更优雅。self没有任何用处,您可以向模块中添加私有函数。
"use strict"
var self = module.exports = {
    myName : function(req, res, next) {
        // accessing method within controller
        self.getName(data);
    },

    getName : function(data) {
        // code
    }
}
function myFunc(){
    return 'got it'
}
module.exports.myFunc = myFunc;
// using "exports."

exports.utilityMethod = (..args) => {
     // do stuff with args
}

exports.doSomething = (someParam) => {
    // this always refers to the module
    // no matter what context you are in
    exports.utility(someParam)
}

// using module.exports

const utility = (..args) => {
   // do stuff with args
}

const doSomething = (someParam) => {
    // Inside the module, the utility method is available
    // to all members
    utility(someParam)
}

// either this
module.exports = {
 utility,
 doSomething,
}

// or 
module.exports = {
 customNameForUtility: utility,
 customNameForDoSomething: doSomething
}
export const utilityMethod = (..args) => {
     // do stuff with args
}

export const doSomething = (someParam) => {
    // this always refers to the module
    // no matter what context you are in
    utility(someParam)
}
const utility = (..args) => {
   // do stuff with args
}

const doSomething = (someParam) => {
    // Inside the module, the utility method is available
    // to all members
    utility(someParam)
}

export default {
  doSomething,
  utility
}

// or 
export {
 doSomething,
  utility
}