Como você chama uma função de outra função em uma module.exports
declaração?
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();
}
}
Estou tentando acessar a função foo
de dentro da função bar
e estou obtendo:
TypeError: o objeto # não possui o método 'foo'
Se eu mudar this.foo()
para apenas foo()
eu recebo:
ReferenceError: foo não está definido
v8.12.0
e não gera mais o erro.bar
não tem nenhuma instrução de retorno portanto executarconsole.log(bla.bar())
simplesmente retornaundefined
Respostas:
Mude
this.foo()
paramodule.exports.foo()
fonte
exports.foo()
parece um pouco estranho e difícil de ler.module.exports.foo()
eexports.foo()
não funciona para mim com o Node.js v5.8.0.Você pode declarar suas funções fora do
module.exports
bloco.Então:
fonte
module.exports = { foo, bar, }
Você também pode fazer isso para torná-lo mais conciso e legível. Isto é o que eu vi feito em vários dos módulos de código aberto bem escritos:
fonte
Você também pode salvar uma referência ao escopo global do módulo fora da definição (module.) Imports.somemodule:
fonte
this
diretamente, sem necessidade de declarar_this
this
não é mais a corretathis
. (Promessas e retornos de chamada)Outra opção, e mais próxima do estilo original do OP, é colocar o objeto que você deseja exportar em uma variável e fazer referência a essa variável para fazer chamadas para outros métodos no objeto. Você pode exportar essa variável e pronto.
fonte
fonte
Service.foo()
e seu código de cliente também estará chamandoService.foo()
com a mesma nomeação.A partir da versão 13 do Node.js., você pode aproveitar os Módulos ES6 .
Seguindo a abordagem de classe:
Isso instanciará a classe apenas uma vez, devido ao cache do módulo do Node:
https://nodejs.org/api/modules.html#modules_caching
fonte
foo
era estático que você chamaria isso de dentrobar
como esta:MyClass.foo()
.Para corrigir seu problema, fiz algumas alterações no bla.js e ele está funcionando,
e nenhuma modificação no app.js
fonte