Bagaimana Anda memanggil suatu fungsi dari dalam fungsi lain dalam module.exports
deklarasi?
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();
}
}
Saya mencoba mengakses fungsi foo
dari dalam fungsi bar
, dan saya mendapatkan:
TypeError: Objek # tidak memiliki metode 'foo'
Jika saya mengubah this.foo()
ke hanya foo()
saya dapatkan:
ReferenceError: foo tidak didefinisikan
v8.12.0
dan tidak lagi membuang kesalahan.bar
tidak memiliki pernyataan pengembalian sehinggaconsole.log(bla.bar())
hanya menjalankan kembaliundefined
Jawaban:
Ubah
this.foo()
kemodule.exports.foo()
sumber
exports.foo()
sepertinya agak canggung dan sulit dibaca.module.exports.foo()
danexports.foo()
tidak bekerja untuk saya dengan Node.js v5.8.0.Anda dapat mendeklarasikan fungsi Anda di luar
module.exports
blok.Kemudian:
sumber
module.exports = { foo, bar, }
Anda juga dapat melakukan ini agar lebih ringkas dan mudah dibaca. Ini yang saya lihat dilakukan di beberapa modul open source yang ditulis dengan baik:
sumber
Anda juga dapat menyimpan referensi ke ruang lingkup global modul di luar (modul.) Definisi ekspor. Modul:
sumber
this
secara langsung, tidak perlu menyatakan_this
this
tidak lagi tepatthis
. (Janji dan panggilan balik)Pilihan lain, dan lebih dekat ke gaya asli OP, adalah untuk meletakkan objek yang ingin Anda ekspor ke dalam variabel dan referensi variabel itu untuk membuat panggilan ke metode lain di objek. Anda kemudian dapat mengekspor variabel itu dan Anda siap melakukannya.
sumber
sumber
Service.foo()
, dan kode klien Anda juga akan memanggilService.foo()
dengan nama yang sama.Dimulai dengan Node.js versi 13 Anda dapat memanfaatkan Modul ES6 .
Mengikuti pendekatan Kelas:
Ini akan membuat instance kelas hanya sekali, karena caching modul Node:
https://nodejs.org/api/modules.html#modules_caching
sumber
foo
itu statis Anda akan menyebutnya dari dalambar
seperti ini:MyClass.foo()
.Untuk memperbaiki masalah Anda, saya telah membuat beberapa perubahan di bla.js dan berfungsi,
dan tidak ada modifikasi di app.js
sumber