Wie ruft man eine Funktion innerhalb einer anderen Funktion in einer module.exports
Deklaration auf?
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();
}
}
Ich versuche, foo
innerhalb der Funktion auf die Funktion zuzugreifen bar
, und erhalte Folgendes:
TypeError: Objekt # hat keine Methode 'foo'
Wenn ich this.foo()
zu nur wechsle , foo()
bekomme ich:
ReferenceError: foo ist nicht definiert
v8.12.0
und löst den Fehler nicht mehr aus.bar
hat keine return-Anweisung, so dass das Laufenconsole.log(bla.bar())
einfach zurückkehrtundefined
Antworten:
Wechseln Sie
this.foo()
zumodule.exports.foo()
quelle
exports.foo()
scheint etwas umständlich und schwer zu lesen.module.exports.foo()
undexports.foo()
arbeite nicht für mich mit Node.js v5.8.0.Sie können Ihre Funktionen außerhalb des
module.exports
Blocks deklarieren .Dann:
quelle
module.exports = { foo, bar, }
Sie können dies auch tun, um es übersichtlicher und lesbarer zu machen. Dies habe ich in einigen der gut geschriebenen Open-Source-Module gesehen:
quelle
Sie können einen Verweis auf den globalen Bereich des Moduls auch außerhalb der Definition (module.) Exports.somemodule speichern:
quelle
this
direkt zu erklären nicht notwendig_this
this
nicht mehr richtig istthis
. (Versprechen und Rückrufe)Eine andere Option, die dem ursprünglichen Stil des OP näher kommt, besteht darin, das zu exportierende Objekt in eine Variable einzufügen und auf diese Variable zu verweisen, um andere Methoden im Objekt aufzurufen. Sie können diese Variable dann exportieren und loslegen.
quelle
quelle
Service.foo()
und Ihr Client-Code ebenfallsService.foo()
mit demselben Namen aufruft .Ab Node.js Version 13 können Sie ES6-Module nutzen .
Dem Klassenansatz folgen:
Dadurch wird die Klasse aufgrund des Modul-Caching von Node nur einmal instanziiert:
https://nodejs.org/api/modules.html#modules_caching
quelle
foo
würden Sie es, wenn es statisch wäre, von innenbar
wie folgt aufrufen :MyClass.foo()
.Um Ihr Problem zu beheben, habe ich einige Änderungen in bla.js vorgenommen und es funktioniert,
und keine Änderung in app.js.
quelle