Jak wywołać funkcję z poziomu innej funkcji w module.exports
deklaracji?
var bla = require('./bla.js');
console.log(bla.bar());
bla.js
module.exports = {
foo: function (req, res, next) {
return ('foo');
},
bar: function(req, res, next) {
this.foo();
}
}
Próbuję uzyskać dostęp do funkcji foo
z poziomu funkcji bar
i otrzymuję:
TypeError: Object # nie ma metody „foo”
Jeśli zmienię this.foo()
tylko na foo()
:
ReferenceError: foo nie jest zdefiniowany
v8.12.0
i nie generuje już błędu.bar
nie ma deklaracji zwrotu, więc uruchomienieconsole.log(bla.bar())
po prostu zwracaundefined
Odpowiedzi:
Zmień
this.foo()
namodule.exports.foo()
źródło
exports.foo()
wydaje się trochę niewygodny i trudny do odczytania.module.exports.foo()
iexports.foo()
nie pracuj dla mnie z Node.js v5.8.0.Możesz zadeklarować swoje funkcje poza
module.exports
blokiem.Następnie:
źródło
module.exports = { foo, bar, }
Możesz to również zrobić, aby uczynić go bardziej zwięzłym i czytelnym. Oto, co widziałem w kilku dobrze napisanych modułach open source:
źródło
Można również zapisać odwołanie do globalnego zasięgu modułu poza definicją (module.) Exports.somemodule:
źródło
this
bezpośrednio, nie trzeba deklarować_this
this
już nie jest słusznathis
. (Inną opcją i bliższą oryginalnemu stylowi OP jest umieszczenie obiektu, który chcesz wyeksportować, w zmiennej i odwołanie się do tej zmiennej w celu wywołania innych metod w obiekcie. Następnie możesz wyeksportować tę zmienną i gotowe.
źródło
źródło
Service.foo()
, a kod klienta będzie również dzwoniłService.foo()
z tą samą nazwą.Począwszy od wersji 13 Node.js , możesz skorzystać z modułów ES6 .
Zgodnie z podejściem klasowym:
Spowoduje to utworzenie instancji klasy tylko raz, ze względu na buforowanie modułu Node:
https://nodejs.org/api/modules.html#modules_caching
źródło
foo
była statyczna nazwałbyś go od wewnątrzbar
tak:MyClass.foo()
.Aby rozwiązać problem, wprowadziłem kilka zmian w pliku bla.js i działa,
i bez modyfikacji w app.js
źródło