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.