Как потребовать модуль с и без аргументов в NodeJS? - PullRequest
0 голосов
/ 09 ноября 2019

Мой запрос:

Как дифференцировать и, следовательно, обрабатывать с и без аргументов в требуемом модуле?

Подробно:

Я написал модуль, который будет поддерживать цветное сообщение (передается в качестве аргумента). Если ничего не передано, то будет выбран цвет по умолчанию (скажем, белый).

require('my-module');    //should print 'Hello World' in white (default) color. 
require('my-module')('red');   //should print 'Hello World' in red color. 

Содержимое файла (my-module.js):

// First Call
displayMessage('');

module.exports = function(color){
  // Second Call
  displayMessage(color);
}

// Main function
function displayMessage(clr){
  ... console in provided clr 
}
  1. Только первый вызов происходит для require ('my-module') с цветом по умолчанию.

  2. Оба вызова происходят для require ('my-module') ('red') один раз с no / default и затем с аргументом красного цвета.

Если я перемещу первый вызов функции внутри отдельного модуля. Экспорт:

module.exports = function(){
  // First Call
  displayMessage('');
}

Он вообще не вызывается в require ('my-module') .

Если я смогу получить индикатор для различия между двумя вызовами, возможно, будет возможно добавить условия соответственно.

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

Просто удалите строку,

 // First Call
displayMessage('')

Когда вам потребуется модуль, он будет загружен и вызван. если вам нужен метод по умолчанию со значением по умолчанию, то либо сделайте его условно без аргументов, либо просто экспортируйте сам метод.

  module.exports = function() {
        // First Call
        displayMessage('');
  }

   module.exports = function(color){
        // Second Call
        displayMessage(color);
  }

  // Main function
  function displayMessage(clr){
        ... console in provided clr 
   }

РЕДАКТИРОВАТЬ:

Согласно комментариям, невозможно вызватьнет аргумента конструктора отовсюду. Так что вам обязательно нужно идти с флагом.

   var argCall = false;
   module.exports = function(color) {
         // Second Call
        argCall = true;
        displayMessage(color);
    }

    if (!argCall) {
          // First Call
          displayMessage('');
    }

    // Main function
   function displayMessage(clr){
         ... console in provided clr 
   }

Теперь он будет работать без вызова,

   require('my-module')      // will  go through FIRST CALL

   require('my-module')('red')      // will go with SECOND CALL only
0 голосов
/ 09 ноября 2019

require ('my-module'), просто загрузите файл или функцию, не будет вызывать никаких методов;

require ('my-module') ();, вызовет функцию один раз с неопределенным аргументом;

require ('my-module') ('red');, вызовет функцию один раз с аргументом 'red';

...