2015-10-12 17 views
5

Jak wywołać funkcję z innej funkcji w deklaracji module.exports?Węzeł JS wywołuje funkcję "lokalną" w module.exports

Mam projekt węzła struktury jv MVC i kontroler o nazwie TestController.js. Chcę uzyskać dostęp do metody w kontrolerze, ale przy użyciu this kluczowe daje poniżej błędu:

cannot call method getName of undefined

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

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

Jak uzyskać dostęp do metody z kontrolerem?

+1

Wartość 'this' zależy od kontekstu wykonania, a nie jak funkcja jest zdefiniowana. – adeneo

Odpowiedz

12

znalazłem rozwiązanie :-)

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

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

'' 'this.getName (dane)' '' nadal działa, ale jest to dobry pomysł z przypisaniem konwencji nazewnictwa – FrickeFresh

3

Możesz uzyskać dostęp do funkcji getName za pomocą module.exports. Podobnie jak:

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

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

Może mógłbyś zrobić to w ten sposób. Zmniejsza zagnieżdżanie. Cały wywóz odbywa się na końcu pliku.

"use strict"; 

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

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

module.exports = { 
    getName : _getName, 
    myName : _myName 
}; 
+1

Dodatkową korzyścią tego podejścia jest to, że funkcje mogą się odwoływać do siebie nawzajem (tzn. "_myName" może wywoływać '_getName') –

+0

Absolutnie, myślę, że jest także bardziej elegancki niż inne rozwiązanie. Nie ma zastosowania * self * i możesz dodać prywatną funkcję do modułu. – Sapher