Вызвать "локальную" функцию в module.exports из другой функции в module.exports?
Как вы вызываете функцию из другой функции в module.exports
декларация?
Вот немного упрощенного кода.
В моем app.js я делаю следующее:
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
и я получаю:
TypeError: Object # has no method 'foo'
Если я изменю this.foo()
чтобы просто foo()
Я получил:
ReferenceError: foo is not defined
11 ответов
Я думаю, что понял. Я только что изменился this.foo()
в module.exports.foo()
и, кажется, работает.
Если у кого-то есть лучший или более правильный метод, пожалуйста, поправьте меня.
Вы можете объявить свои функции за пределами блока module.exports.
var foo = function (req, res, next) {
return ('foo');
}
var bar = function (req, res, next) {
return foo();
}
Затем:
module.exports = {
foo: foo,
bar: bar
}
Вы также можете сделать это, чтобы сделать его более кратким и читабельным. Вот что я видел в нескольких хорошо написанных модулях с открытым исходным кодом:
var self = module.exports = {
foo: function (req, res, next) {
return ('foo');
},
bar: function(req, res, next) {
self.foo();
}
}
Вы также можете сохранить ссылку на глобальную область модуля вне определения (module.) Exports.somemodule:
var _this = this;
exports.somefunction = function() {
console.log('hello');
}
exports.someotherfunction = function() {
_this.somefunction();
}
Другой вариант, более близкий к первоначальному стилю OP, состоит в том, чтобы поместить объект, который вы хотите экспортировать, в переменную и ссылаться на эту переменную, чтобы вызывать другие методы объекта. Затем вы можете экспортировать эту переменную, и все готово.
var self = {
foo: function (req, res, next) {
return ('foo');
},
bar: function (req, res, next) {
return self.foo();
}
};
module.exports = self;
const Service = {
foo: (a, b) => a + b,
bar: (a, b) => Service.foo(a, b) * b
}
module.exports = Service
В NodeJs я следовал этому подходу:
class MyClass {
constructor() {}
foo(req, res, next) {
return ('foo');
}
bar(req, res, next) {
this.foo();
}
}
module.exports = new MyClass();
Это создаст экземпляр класса только один раз из-за кэширования модуля Node:
https://nodejs.org/api/modules.html
Чтобы исправить вашу проблему, я сделал несколько изменений в bla.js, и он работает,
var foo= function (req, res, next) {
console.log('inside foo');
return ("foo");
}
var bar= function(req, res, next) {
this.foo();
}
module.exports = {bar,foo};
и никаких изменений в app.js
var bla = require('./bla.js');
console.log(bla.bar());
Если вы сделаете это, вы потеряете ссылку на объект внутри вызывающей функции. Например:
module.exports.a = function () {
return true
}
module.exports.b = function() {
return this.a();
}
здесь вы получите проблему, потому что, когда вы вызываете this.a(), он ссылается на объектb
функция.
Чтобы решить эту проблему, вам нужно где-то сохранить ссылку на объект или использовать функцию стрелки, потому что функция стрелки не имеет собственного объекта, поэтому она всегда будет ссылаться на внешний объект.this
объект
Чтобы решить эту проблему, измените свою функцию следующим образом.
module.exports.a = function () {
return true
}
module.exports.b = () => {
return this.a();
}
What I do is to create a standalone function and reference it in both places.
That way, it prevents any issue with
this
irrespective of using an arrow or regular function
function foo(req,res,next) {
return ('foo');
}
Then I can reference
foo
at both places
module.exports = {
foo, // ES6 for foo:foo
bar: function(req, res, next) {
foo();
}
}
module.exports = function (){
return{
adding: function(a ,b){
return a+b;
},
test: function () {
adding(a, b);
}
}
}
Могу ли я узнать, как получить доступ к функции "добавления" из функции "тест"?