Как вы вызываете функцию из другой функции в module.exports
объявлении?
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();
}
}
Я пытаюсь получить доступ к функции foo
изнутри функции bar
, и я получаю:
Ошибка типа: у объекта # нет метода 'foo'
Если я перехожу this.foo()
на просто foo()
я получаю:
ReferenceError: foo не определено
v8.12.0
и больше не выдает ошибку.bar
не имеет оператора возврата, поэтому выполнениеconsole.log(bla.bar())
просто возвращаетundefined
Ответы:
Изменить
this.foo()
наmodule.exports.foo()
источник
exports.foo()
кажется немного неловким и трудным для чтения.module.exports.foo()
иexports.foo()
не работают для меня с Node.js v5.8.0.Вы можете объявить свои функции за пределами
module.exports
блока.Затем:
источник
module.exports = { foo, bar, }
Вы также можете сделать это, чтобы сделать его более кратким и читабельным. Вот что я видел в нескольких хорошо написанных модулях с открытым исходным кодом:
источник
Вы также можете сохранить ссылку на глобальную область модуля за пределами определения (module.) Exports.somemodule:
источник
this
напрямую, не нужно объявлять_this
this
уже не правильноthis
. (Обещания и обратные вызовы)Другой вариант, более близкий к первоначальному стилю OP, состоит в том, чтобы поместить объект, который вы хотите экспортировать, в переменную и ссылаться на эту переменную, чтобы вызывать другие методы объекта. Затем вы можете экспортировать эту переменную, и все готово.
источник
источник
Service.foo()
, и ваш клиентский код также будет вызыватьсяService.foo()
с тем же именем.Начиная с Node.js версии 13, вы можете воспользоваться модулями ES6 .
Следуя подходу класса:
Это создаст экземпляр класса только один раз из-за кэширования модуля узла:
https://nodejs.org/api/modules.html#modules_caching
источник
foo
была статичной бы вы назвали его с внутренней стороны,bar
как это:MyClass.foo()
.Чтобы исправить вашу проблему, я сделал несколько изменений в bla.js, и он работает,
и никаких изменений в app.js
источник