¿Cómo se llama a una función desde otra función en una module.exports
declaración?
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();
}
}
Estoy tratando de acceder a la función foo
desde dentro de la función bar
y obtengo:
TypeError: Object # no tiene el método 'foo'
Si cambio this.foo()
a solo foo()
obtengo:
ReferenceError: foo no está definido
v8.12.0
y ya no arroja el error.bar
no tiene declaración de devolución, por lo que la ejecuciónconsole.log(bla.bar())
simplemente regresaundefined
Respuestas:
Cambiar
this.foo()
amodule.exports.foo()
fuente
exports.foo()
parece un poco incómodo y difícil de leer.module.exports.foo()
yexports.foo()
no funciona para mí con Node.js v5.8.0.Puede declarar sus funciones fuera del
module.exports
bloque.Luego:
fuente
module.exports = { foo, bar, }
También puede hacer esto para hacerlo más conciso y legible. Esto es lo que he visto hacer en varios de los módulos de código abierto bien escritos:
fuente
También puede guardar una referencia al alcance global del módulo fuera de la definición (module.) Exports.somemodule:
fuente
this
directamente, no es necesario declarar_this
this
que ya no es la correctathis
. (Promesas y devoluciones de llamada)Otra opción, y más cercana al estilo original del OP, es colocar el objeto que desea exportar en una variable y hacer referencia a esa variable para realizar llamadas a otros métodos en el objeto. Luego puede exportar esa variable y listo.
fuente
fuente
Service.foo()
, y su código de cliente también llamaráService.foo()
con el mismo nombre.A partir de la versión 13 de Node.js , puede aprovechar los módulos ES6 .
Siguiendo el enfoque de clase:
Esto creará una instancia de la clase solo una vez, debido al almacenamiento en caché del módulo de Node:
https://nodejs.org/api/modules.html#modules_caching
fuente
foo
era estática que le llama desde el interior debar
la siguiente manera:MyClass.foo()
.Para solucionar su problema, he realizado algunos cambios en bla.js y está funcionando,
y ninguna modificación en app.js
fuente