Я пытался добавить два module.exports в свой модуль NodeJS. Я пробовал код ниже для своего модуля:
exports.one = function(data){
const one = data;
};
module.exports = function(msg) {
console.info(one+'::'+msg);
};
И ниже код для index.js:
var myModule = require('./mymodule.js');
myModule.one('hi');
myModule('bro');
myModule('Dear');
myModule('Dude');
Я ожидал, что он запишет в консоль следующие данные:
hi bro
hi Dear
hi Dude
Но консоль говорит:
TypeError: myModule.one is not a function
at Object.<anonymous> (....
Пожалуйста, как мне решить эту проблему? Есть вопросы о переполнении стека, в которых спрашивается, как использовать несколько модулей module.exports в модулях NodeJS. Но ответ примерно такой:
exports.one = function (){};
exports.two = function (){};
Но если я использую этот код, я должен использовать
myModule.one('hi');
myModule.two('bro');
myModule.two('Dear');
myModule.two('Dude');
Вместо:
myModule.one('hi');
myModule('bro');
myModule('Dear');
myModule('Dude');



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы сделаете следующее:
module.exports.one = function(data){
const one = data;
};
module.exports = function(msg) {
console.info(data+'::'+msg);
};
Сначала вы назначаете свойство один объекту модуля (exports.one=...). Затем вы повторно настраиваете весь объект module.exports со второй строкой и, таким образом, стираете первую функцию, которую вы ему назначили.
Решить ее можно так:
module.exports.one = function(data){
const one = data;
};
module.exports.two = function(msg) {
console.info(data+'::'+msg);
};
Затем вы можете вызывать функции в другом модуле следующим образом:
var myModule = require('./mymodule.js');
myModule.one(arg1) // calls first function
myModule.two(arg2) // calls second function
Вы, кажется, ищете
let one = '';
module.exports = function(msg) {
console.info(data+'::'+msg);
};
module.exports.one = function(data){
one = data;
};
Обратите внимание, что переменная exports - это просто псевдоним для объекта module.exports, и при перезаписи этой переменной своей функцией вы выбросили ее содержимое. Вам нужно будет поместить метод one в свою основную функцию.
Отличная идея! Но есть небольшая проблема. Я сказал, что конфигурация, сохраненная в myModule.one('hi');, используется при запуске myModule('bro');, где myModule('bro'); определяется первым в модуле.
Обратите внимание на строку с надписью const one = data. Я собирался использовать его в функции module.exports, которая фактически расположена над функцией module.exports.one.
Когда я попробовал module.exports = function(msg) { console.info(one+'::'+msg); }; module.exports.one = function(data){ const one = data; };, в консоли появилось сообщение об ошибке ReferenceError: один не определен
@NodeDev Не имеет значения, когда функции определены, важно, когда они вызываются. Поскольку они вызываются только после того, как все они были определены, нет проблем с вызовом одного из другого.
@NodeDev Конечно, это не определено - const one - это переменная местный. Вы можете поместить его в область видимости уровня модуля, если хотите получить к нему доступ из обеих функций, хотя тогда вам нужно будет использовать let, а не const.
Ой! Теперь я понимаю. Теперь все работает нормально. Пожалуйста, отредактируйте свой ответ и поместите let one; module.exports = function(msg) { console.info(one+'::'+msg); }; module.exports.one = function(data){ one = data; };, так как он включает в себя все коды и может помочь другим.
@NodeDev Кстати, обратите внимание, что такая глобальная конфигурация относительно не рекомендуется. Было бы лучше разрешить создание нескольких разных экземпляров, например. с var myModule = require('./mymodule.js').one("hi"); myModule("bro").
Большой! И большое спасибо! Почти полчаса пытался решить эту проблему и теперь все решено ?
Да, но первая функция предназначена для назначения некоторых конфигураций приложению / модулю. Затем с помощью myModule ('bro'); myModule ('Уважаемый'); myModule ('Чувак'); Я хочу запустить основную функцию, которая зависит от конфигурации, назначенной myModule.one (config);