Déclarez plusieurs modules.exports dans Node.js


244

Ce que j'essaie de réaliser, c'est de créer un module contenant plusieurs fonctions.

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);

Le problème que j'ai, c'est que firstParamc'est un type d'objet et secondParamc'est une chaîne URL, mais quand je l'ai, il se plaint toujours que le type est incorrect.

Comment puis-je déclarer plusieurs modules.exports dans ce cas?


2
Il me manque clairement un élément clé de ce paradigme, car il me souffle ce qu'il faut pour que cela fonctionne.
Joshua Pinter

Réponses:


541

Vous pouvez faire quelque chose comme:

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

Ou juste:

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

Puis dans le script d'appel:

const myModule = require('./myModule.js');
const method = myModule.method;
const otherMethod = myModule.otherMethod;
// OR:
const {method, otherMethod} = require('./myModule.js');

25
Utilisez toujours module.exports = {}et non module.method = .... stackoverflow.com/a/26451885/155740
Scotty

9
Je n'utilise module.methodnulle part ici ... seulement exports.method, ce qui est juste une référence à module.exports.method, se comporte donc de la même manière. La seule différence est que nous n'avons pas défini module.exports, donc c'est par défaut {}, à moins que je ne me trompe.
purée

@mash cela fonctionnerait dans un autre fichier en utilisant: var otherMethod = require('module.js')(otherMethod);? Autrement dit, cette ligne nécessiterait-elle la otherMethodfonction comme si c'était la seule fonction de la page et que l'exportation avait été module.exports = secondMethod;:?
YPCrumble

3
@YPCrumble que vous pourriez faire var otherMethod = require('module.js').otherMethod.
purée

Pouvez-vous montrer la correspondance requise dans l'autre programme qui irait avec cela?
NealWalters

138

Pour exporter plusieurs fonctions, vous pouvez simplement les lister comme ceci:

module.exports = {
   function1,
   function2,
   function3
}

Et puis pour y accéder dans un autre fichier:

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

Et puis vous pouvez appeler chaque fonction en appelant:

myFunctions.function1
myFunctions.function2
myFunctions.function3

1
Réponse parfaite, cette réponse devrait être marquée comme la bonne réponse.
Vishnu Ranganathan

Comment avez-vous utilisé require("./lib/file.js")? Je dois utiliser require("../../lib/file.js"), sinon cela ne fonctionnera pas.
Antonio Ooi

11
Vous pouvez également le faire lorsque const { function1, function2, function3 } = require("./lib/file.js")vous y accédez : ce qui vous permet de les appeler directement (par exemple function1au lieu de myFunctions.function1)
David Yeiser

C'est l'approche la plus propre et la plus simple!
Zeus

43

en plus de @mash answer, je vous recommande de toujours faire ce qui suit:

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

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

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

Notez ici:

  • Vous pouvez appeler methoddepuis otherMethodet vous en aurez beaucoup besoin
  • Vous pouvez rapidement masquer une méthode comme privée lorsque vous en avez besoin
  • C'est plus facile pour la plupart des IDE de comprendre et de compléter automatiquement votre code;)
  • Vous pouvez également utiliser la même technique d'importation:

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


Notez que cela utilise le raccourci d'initialisation de l'objet es6 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
chrismarx

1
C'est la meilleure réponse à mon humble avis car elle traite de l'accès à la méthode sous otherMethod. Merci d'avoir fait remarquer cela.
Jeff Beagley

15

C'est juste pour ma référence car ce que j'essayais de réaliser peut être accompli par cela.

dans le module.js

Nous pouvons faire quelque chose comme ça

    module.exports = function ( firstArg, secondArg ) {

    function firstFunction ( ) { ... }

    function secondFunction ( ) { ... }

    function thirdFunction ( ) { ... }

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

    }

dans le main.js

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

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>);

8

Si les fichiers sont écrits à l'aide de l'exportation ES6, vous pouvez écrire:

module.exports = {
  ...require('./foo'),
  ...require('./bar'),
};

8

Vous pouvez le faire en créant un nouvel objet dans le module au lieu de le remplacer.

par exemple:

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

et appeler

var test = require('path_to_file').testOne:
testOne();

Cela m'a paru une approche très simple par rapport aux autres réponses! Really NIce
HN Singh

6

Vous pouvez écrire une fonction qui délègue manuellement entre les autres fonctions:

module.exports = function(arg) {
    if(arg instanceof String) {
         return doStringThing.apply(this, arguments);
    }else{
         return doObjectThing.apply(this, arguments);
    }
};

C'est un moyen de réaliser une surcharge de fonctions, mais ce n'est pas très ... élégant. Je pense que la réponse de Mash est plus propre et montre mieux l'intention.
Nepoxx

5

utilisez ceci

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

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();

3

Importation et exportation de modules de deux types.

type 1 (module.js):

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

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

type 1 (main.js):

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

type 2 (module.js):

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

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

type 2 (main.js):

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

Comment utiliser le module d'importation?

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

3

vous pouvez également l'exporter comme ceci

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

ou pour des fonctions anonymes comme celle-ci

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

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

2

Il existe plusieurs façons de le faire, l'une d'entre elles est mentionnée ci-dessous. Supposez simplement que vous avez un fichier .js comme celui-ci.

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

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

Vous pouvez exporter ces fonctions à l'aide de l'extrait de code suivant,

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

Et vous pouvez utiliser les fonctions exportées à l'aide de cet extrait de code,

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

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

Je sais que c'est une réponse tardive, mais j'espère que cela vous aidera!


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
    };
}());

0

Si vous déclarez une classe dans le fichier module au lieu de l'objet simple

Fichier: 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];

Fichier principal: index.js

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

0

Vous pouvez également utiliser cette approche

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

ou

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

0

Ajout ici pour quelqu'un pour aider:

ce bloc de code aidera à ajouter plusieurs plugins dans cypress index.js Plugins -> cypress-ntlm-auth et cypress env file selection

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;
};
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.