Несколько модулей module.exports для NodeJS

Я пытался добавить два 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');
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
3 792
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы сделаете следующее:

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

Да, но первая функция предназначена для назначения некоторых конфигураций приложению / модулю. Затем с помощью myModule ('bro'); myModule ('Уважаемый'); myModule ('Чувак'); Я хочу запустить основную функцию, которая зависит от конфигурации, назначенной myModule.one (config);

NodeDev 25.07.2018 16:07
Ответ принят как подходящий

Вы, кажется, ищете

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'); определяется первым в модуле.

NodeDev 25.07.2018 16:17

Обратите внимание на строку с надписью const one = data. Я собирался использовать его в функции module.exports, которая фактически расположена над функцией module.exports.one.

NodeDev 25.07.2018 16:18

Когда я попробовал module.exports = function(msg) { console.info(one+'::'+msg); }; module.exports.one = function(data){ const one = data; };, в консоли появилось сообщение об ошибке ReferenceError: один не определен

NodeDev 25.07.2018 16:20

@NodeDev Не имеет значения, когда функции определены, важно, когда они вызываются. Поскольку они вызываются только после того, как все они были определены, нет проблем с вызовом одного из другого.

Bergi 25.07.2018 16:21

@NodeDev Конечно, это не определено - const one - это переменная местный. Вы можете поместить его в область видимости уровня модуля, если хотите получить к нему доступ из обеих функций, хотя тогда вам нужно будет использовать let, а не const.

Bergi 25.07.2018 16:23

Ой! Теперь я понимаю. Теперь все работает нормально. Пожалуйста, отредактируйте свой ответ и поместите let one; module.exports = function(msg) { console.info(one+'::'+msg); }; module.exports.one = function(data){ one = data; };, так как он включает в себя все коды и может помочь другим.

NodeDev 25.07.2018 16:25

@NodeDev Кстати, обратите внимание, что такая глобальная конфигурация относительно не рекомендуется. Было бы лучше разрешить создание нескольких разных экземпляров, например. с var myModule = require('./mymodule.js').one("hi"); myModule("bro").

Bergi 25.07.2018 16:29

Большой! И большое спасибо! Почти полчаса пытался решить эту проблему и теперь все решено ?

NodeDev 25.07.2018 16:33

Другие вопросы по теме