Declarar vários module.exports no Node.js

243

O que estou tentando conseguir é criar um módulo que contenha várias funções nele.

module.js:

module.exports = function(firstParam) { console.log("You did it"); },
module.exports = function(secondParam) { console.log("Yes you did it"); }, 
// This may contain more functions

main.js:

var foo = require('module.js')(firstParam);
var bar = require('module.js')(secondParam);

O problema que tenho é que firstParamé um tipo de objeto e secondParamuma string de URL, mas quando o tenho sempre reclama que o tipo está errado.

Como posso declarar vários module.exports neste caso?

Todos
fonte
2
Claramente, estou sentindo falta de uma parte essencial desse paradigma, porque isso me deixa impressionado com o que é necessário para que isso funcione.
27416 Joshua Pinter

Respostas:

540

Você pode fazer algo como:

module.exports = {
    method: function() {},
    otherMethod: function() {},
};

Ou apenas:

exports.method = function() {};
exports.otherMethod = function() {};

Em seguida, no script de chamada:

const myModule = require('./myModule.js');
const method = myModule.method;
const otherMethod = myModule.otherMethod;
// OR:
const {method, otherMethod} = require('./myModule.js');
amassar
fonte
25
Sempre use module.exports = {}e não module.method = .... stackoverflow.com/a/26451885/155740
Scotty
9
Eu não estou usando em module.methodnenhum lugar aqui ... apenas exports.method, que é apenas uma referência module.exports.method, então se comporta da mesma maneira. A única diferença é que não definimos module.exports, então o padrão é {}, a menos que eu esteja enganado.
Mash
@mash funcionaria em outro arquivo usando var otherMethod = require('module.js')(otherMethod);:? Ou seja, essa linha exigiria a otherMethodfunção como se fosse a única função na página e a exportação tivesse sido module.exports = secondMethod;:?
YPCrumble
3
@YPCrumble você poderia fazer var otherMethod = require('module.js').otherMethod.
triturar
Você pode mostrar as exigências de correspondência no outro programa que acompanha isso?
NealWalters 07/07
137

Para exportar várias funções, basta listá-las da seguinte maneira:

module.exports = {
   function1,
   function2,
   function3
}

E depois acessá-los em outro arquivo:

var myFunctions = require("./lib/file.js")

E então você pode chamar cada função chamando:

myFunctions.function1
myFunctions.function2
myFunctions.function3
Devorah
fonte
1
Resposta perfeita, esta resposta deve ser marcada como a resposta certa.
Vishnu Ranganathan
Como vocês usaram require("./lib/file.js")? Eu preciso usar require("../../lib/file.js"), caso contrário, não vai funcionar.
Antonio Ooi
11
Você também pode fazer isso ao acessá-los: o const { function1, function2, function3 } = require("./lib/file.js")que lhe permite chamá-los diretamente (por exemplo, em function1vez de myFunctions.function1) #
1011 David Yeiser
Essa é a abordagem mais limpa e simples!
Zeus
42

além da resposta @mash, recomendo que você sempre faça o seguinte:

const method = () => {
   // your method logic
}

const otherMethod = () => {
   // your method logic 
}

module.exports = {
    method, 
    otherMethod,
    // anotherMethod
};

Observe aqui:

  • Você pode chamar methoda partir otherMethode você vai precisar deste monte um
  • Você pode ocultar rapidamente um método como privado quando precisar
  • É mais fácil para a maioria dos IDEs entender e preencher automaticamente seu código;)
  • Você também pode usar a mesma técnica para importação:

    const {otherMethod} = require('./myModule.js');

Alnamrouti com tarifa
fonte
Observe que isso usa o atalho do inicializador de objetos es6 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
chrismarx
1
Esta é a melhor resposta imho, pois aborda o método de acesso ao formulário otherMethod. Obrigado por apontar isso.
Jeff Beagley
15

Isso é apenas para minha referência, pois o que eu estava tentando alcançar pode ser conseguido com isso.

No module.js

Nós podemos fazer algo assim

    module.exports = function ( firstArg, secondArg ) {

    function firstFunction ( ) { ... }

    function secondFunction ( ) { ... }

    function thirdFunction ( ) { ... }

      return { firstFunction: firstFunction, secondFunction: secondFunction,
 thirdFunction: thirdFunction };

    }

No main.js

var name = require('module')(firstArg, secondArg);
Todos
fonte
10

module.js:

const foo = function(<params>) { ... }
const bar = function(<params>) { ... } 

//export modules
module.exports = {
    foo,
    bar 
}

main.js:

// import modules
var { foo, bar } = require('module');

// pass your parameters
var f1 = foo(<params>);
var f2 = bar(<params>);
Anthony Awuley
fonte
8

Se os arquivos forem gravados usando a exportação ES6, você poderá escrever:

module.exports = {
  ...require('./foo'),
  ...require('./bar'),
};
Jon Sakas
fonte
8

Uma maneira de fazer isso é criar um novo objeto no módulo em vez de substituí-lo.

por exemplo:

var testone = function () {
    console.log('test one');
};
var testTwo = function () {
    console.log('test two');
};
module.exports.testOne = testOne;
module.exports.testTwo = testTwo;

e ligar

var test = require('path_to_file').testOne:
testOne();
Jesse Teixeira
fonte
Isso me pareceu uma abordagem muito simples em comparação com outras respostas! Realmente agradável
HN Singh
6

Você pode escrever uma função que delega manualmente entre as outras funções:

module.exports = function(arg) {
    if(arg instanceof String) {
         return doStringThing.apply(this, arguments);
    }else{
         return doObjectThing.apply(this, arguments);
    }
};
icktoofay
fonte
Essa é uma maneira de obter sobrecarga de funções, mas não é muito ... elegante. Acho que a resposta do Mash é mais limpa e mostra melhor a intenção.
Nepoxx
5

usa isto

(function()
{
  var exports = module.exports = {};
  exports.yourMethod =  function (success)
  {

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();
Siddharth
fonte
3

Dois tipos de importação e exportação de módulos.

tipo 1 (module.js):

// module like a webpack config
const development = {
  // ...
};
const production = {
  // ...
};

// export multi
module.exports = [development, production];
// export single
// module.exports = development;

tipo 1 (main.js):

// import module like a webpack config
const { development, production } = require("./path/to/module");

tipo 2 (module.js):

// module function no param
const module1 = () => {
  // ...
};
// module function with param
const module2 = (param1, param2) => {
  // ...
};

// export module
module.exports = {
  module1,
  module2
}

tipo 2 (main.js):

// import module function
const { module1, module2 } = require("./path/to/module");

Como usar o módulo de importação?

const importModule = {
  ...development,
  // ...production,
  // ...module1,
  ...module2("param1", "param2"),
};
illvart
fonte
3

também você pode exportar assim

const func1 = function (){some code here}
const func2 = function (){some code here}
exports.func1 = func1;
exports.func2 = func2;

ou para funções anônimas como esta

    const func1 = ()=>{some code here}
    const func2 = ()=>{some code here}
    exports.func1 = func1;
    exports.func2 = func2;
bahri noredine
fonte
2

module1.js:

var myFunctions = { 
    myfunc1:function(){
    },
    myfunc2:function(){
    },
    myfunc3:function(){
    },
}
module.exports=myFunctions;

main.js

var myModule = require('./module1');
myModule.myfunc1(); //calling myfunc1 from module
myModule.myfunc2(); //calling myfunc2 from module
myModule.myfunc3(); //calling myfunc3 from module
Puria jahanbani
fonte
2

Existem várias maneiras de fazer isso, uma delas é mencionada abaixo. Suponha que você tenha um arquivo .js como este.

let add = function (a, b) {
   console.log(a + b);
};

let sub = function (a, b) {
   console.log(a - b);
};

Você pode exportar essas funções usando o seguinte snippet de código,

 module.exports.add = add;
 module.exports.sub = sub;

E você pode usar as funções exportadas usando esse trecho de código,

var add = require('./counter').add;
var sub = require('./counter').sub;

add(1,2);
sub(1,2);

Sei que esta é uma resposta tardia, mas espero que ajude!

Achintha Isuru
fonte
0
module.exports = (function () {
    'use strict';

    var foo = function () {
        return {
            public_method: function () {}
        };
    };

    var bar = function () {
        return {
            public_method: function () {}
        };
    };

    return {
        module_a: foo,
        module_b: bar
    };
}());
balthazarbux
fonte
0

Se você declarar uma classe no arquivo de módulo em vez do objeto simples

Arquivo: UserModule.js

//User Module    
class User {
  constructor(){
    //enter code here
  }
  create(params){
    //enter code here
  }
}
class UserInfo {
  constructor(){
    //enter code here
  }
  getUser(userId){
    //enter code here
    return user;
  }
}

// export multi
module.exports = [User, UserInfo];

Arquivo principal: index.js

// import module like
const { User, UserInfo } = require("./path/to/UserModule");
User.create(params);
UserInfo.getUser(userId);
Manish
fonte
0

Você também pode usar essa abordagem

module.exports.func1 = ...
module.exports.func2 = ...

ou

exports.func1 = ...
exports.func2 = ...
Bogdan Surai
fonte
0

Adicionando aqui alguém para ajudar:

esse bloco de código ajudará a adicionar vários plugins no cypress index.js Plugins -> seleção de arquivos cypress-ntlm-auth e cypress env

const ntlmAuth = require('cypress-ntlm-auth/dist/plugin');
const fs = require('fs-extra');
const path = require('path');

const getConfigurationByFile = async (config) => {
  const file = config.env.configFile || 'dev';
  const pathToConfigFile = path.resolve(
    '../Cypress/cypress/',
    'config',
    `${file}.json`
  );
  console.log('pathToConfigFile' + pathToConfigFile);
  return fs.readJson(pathToConfigFile);
};

module.exports = async (on, config) => {
  config = await getConfigurationByFile(config);
  await ntlmAuth.initNtlmAuth(config);
  return config;
};
testtek
fonte