Deklarieren Sie mehrere module.exports in Node.js


242

Ich versuche, ein Modul zu erstellen, das mehrere Funktionen enthält.

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

Das Problem, das ich habe, ist, dass das firstParamein Objekttyp und das secondParameine URL-Zeichenfolge ist, aber wenn ich das habe, beschwert es sich immer, dass der Typ falsch ist.

Wie kann ich in diesem Fall mehrere module.exports deklarieren?


2
Mir fehlt eindeutig ein wesentlicher Teil dieses Paradigmas, weil es mich umgehauen hat, was nötig ist, um dies zum Laufen zu bringen.
Joshua Pinter

Antworten:


538

Sie können so etwas tun wie:

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

Oder nur:

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

Dann im aufrufenden Skript:

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

25
Immer benutzen module.exports = {}und nicht module.method = .... stackoverflow.com/a/26451885/155740
Scotty

9
Ich benutze module.methodhier nirgendwo ... nur exports.method, was nur ein Hinweis ist module.exports.method, verhält sich also genauso. Der einzige Unterschied ist, dass wir nicht definiert haben module.exports, daher wird standardmäßig verwendet {}, es sei denn, ich irre mich.
Maische

@mash würde dies in einer anderen Datei funktionieren mit : var otherMethod = require('module.js')(otherMethod);? Dh, würde diese Zeile die otherMethodFunktion erfordern, als wäre sie die einzige Funktion auf der Seite und der Export wäre : module.exports = secondMethod;?
YPCrumble

3
@YPCrumble könnten Sie tun var otherMethod = require('module.js').otherMethod.
Brei

Können Sie die Übereinstimmungsanforderungen in dem anderen Programm zeigen, das dazu gehört?
NealWalters

136

Um mehrere Funktionen zu exportieren, können Sie sie einfach wie folgt auflisten:

module.exports = {
   function1,
   function2,
   function3
}

Und dann, um in einer anderen Datei darauf zuzugreifen:

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

Und dann können Sie jede Funktion aufrufen, indem Sie Folgendes aufrufen:

myFunctions.function1
myFunctions.function2
myFunctions.function3

Perfekte Antwort, diese Antwort sollte ich als die richtige Antwort markieren.
Vishnu Ranganathan

Wie habt ihr es benutzt require("./lib/file.js")? Ich muss verwenden require("../../lib/file.js"), sonst funktioniert es nicht.
Antonio Ooi

11
Sie können dies auch tun, wenn Sie auf sie zugreifen: const { function1, function2, function3 } = require("./lib/file.js")function1myFunctions.function1
Dadurch

Dies ist der sauberste und einfachste Ansatz!
Zeus

42

Zusätzlich zu @mash answer empfehle ich Ihnen, immer Folgendes zu tun:

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

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

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

Beachten Sie hier:

  • Sie können anrufen methodaus otherMethodund Sie werden diese viel brauchen
  • Sie können eine Methode bei Bedarf schnell als privat ausblenden
  • Dies ist für die meisten IDEs einfacher, Ihren Code zu verstehen und automatisch zu vervollständigen;)
  • Sie können dieselbe Technik auch für den Import verwenden:

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


Beachten Sie, dass dies die Verknüpfung zum es6-Objektinitialisierer verwendet - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
chrismarx

1
Dies ist imho die bessere Antwort, da es sich um den Zugriff auf die Methode von otherMethod handelt. Vielen Dank für den Hinweis.
Jeff Beagley

15

Dies ist nur als Referenz, da das, was ich erreichen wollte, dadurch erreicht werden kann.

In dem module.js

Wir können so etwas tun

    module.exports = function ( firstArg, secondArg ) {

    function firstFunction ( ) { ... }

    function secondFunction ( ) { ... }

    function thirdFunction ( ) { ... }

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

    }

In dem 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

Eine Möglichkeit, dies zu tun, besteht darin, ein neues Objekt im Modul zu erstellen, anstatt es zu ersetzen.

beispielsweise:

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

und anzurufen

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

Dies schien mir ein sehr einfacher Ansatz im Vergleich zu anderen Antworten zu sein! Wirklich NIce
HN Singh

7

Wenn die Dateien mit dem ES6-Export geschrieben wurden, können Sie Folgendes schreiben:

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

6

Sie können eine Funktion schreiben, die manuell zwischen den anderen Funktionen delegiert:

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

Dies ist ein Weg, um eine Funktionsüberlastung zu erreichen, aber es ist nicht sehr ... elegant. Ich denke, Mashs Antwort ist sauberer und zeigt besser Absicht.
Nepoxx

5

benutze das

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

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();

3

Import und Export von Modulen mit zwei Typen.

Typ 1 (module.js):

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

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

Typ 1 (main.js):

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

Typ 2 (module.js):

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

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

Typ 2 (main.js):

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

Wie verwende ich das Importmodul?

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

3

Sie können es auch so exportieren

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

oder für anonyme Funktionen wie diese

    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

Es gibt mehrere Möglichkeiten, dies zu tun. Eine Möglichkeit wird unten erwähnt. Nehmen Sie einfach an, Sie haben eine solche .js-Datei.

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

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

Sie können diese Funktionen mit dem folgenden Codeausschnitt exportieren:

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

Und Sie können die exportierten Funktionen mit diesem Code-Snippet verwenden.

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

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

Ich weiß, dass dies eine späte Antwort ist, aber ich hoffe, das hilft!


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

Wenn Sie eine Klasse in einer Moduldatei anstelle des einfachen Objekts deklarieren

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

Hauptdatei: index.js

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

0

Sie können diesen Ansatz auch verwenden

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

oder

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

0

Hier hinzufügen, damit jemand hilft:

Dieser Codeblock hilft beim Hinzufügen mehrerer Plugins zu cypress index.js Plugins -> Auswahl der Datei cypress-ntlm-auth und 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;
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.