2013-05-19 10 views
90

Was ich versuche zu erreichen, ist ein Modul zu erstellen, das mehrere Funktionen enthält.Deklarieren Sie mehrere Module.exports in Node.js

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 die firstParam ein Typ Objekt ist und die secondParam ist eine URL-Zeichenfolge, aber wenn ich, dass es immer beklagt sich, dass der Typ falsch ist.

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

+0

Ich vermisse eindeutig einige Schlüssel dieses Paradigmas, weil es mich wegbläst, was es braucht, um dies zur Arbeit zu bringen. –

Antwort

231

Sie können wie etwas tun:

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

oder auch nur:

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

Dann im rufenden Programm:

var MyMethods = require('./myModule.js'); 
var method = MyMethods.method; 
var otherMethod = MyMethods.otherMethod; 
+8

Verwenden Sie immer 'module.exports = {}' und nicht 'module.method = ...'. http://StackOverflow.com/a/26451885/155740 – Scotty

+3

Ich benutze 'module.method' nirgendwo hier ... nur' exports.method', das ist nur ein Verweis auf 'module.exports.method', verhält sich so. Der einzige Unterschied ist, dass wir 'module.exports' nicht definiert haben, daher wird standardmäßig' {} 'verwendet, es sei denn, ich täusche mich. – mash

+0

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

6

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

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

Dies ist eine Möglichkeit, um Funktionsüberlastung zu erreichen, aber es ist nicht sehr ... elegant. Ich denke, Mash 'Antwort ist sauberer und zeigt besser Absicht. – Nepoxx

10

Dies ist nur für meine Referenz als das was ich erreichen wollte erreicht werden kann.

In der module.js

Wir können dies im main.js

var name = require('module')(firstArg, secondArg); 
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 
    }; 
}()); 
2

Verwendung

module.exports = function (firstArg, secondArg) { 

    function firstFunction () { ... } 

    function secondFunction () { ... } 

    function thirdFunction () { ... } 

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

    } 

wie diese etwas tun

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

    } 
    exports.yourMethod2 = function (success) 
    { 

    } 


})(); 
3

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

zum Beispiel:

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

und rufen

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

mehrere Funktionen zu exportieren, können Sie sie einfach wie diese Liste:

module.exports = { 
    function1, 
    function2, 
    function3 
} 

Und dann sie in einem anderen zugreifen Datei:

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

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

myFunctions.function1 
myFunctions.function2 
myFunctions.function3 
+1

genial ... arbeitete wie ein Charme –

+0

Perfekte Antwort, sollte diese Antwort mich als die richtige Antwort markiert. –

12

zusätzlich Antwort auf @mash empfehle ich Ihnen immer wie folgt vorgehen:

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

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

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

Hinweis hier:

  • Sie können method von otherMethod anrufen, und Sie werden dies viel
  • benötigen
  • Sie können eine Methode als private schnell ausblenden, wenn Sie
  • Das ist einfacher für die meisten IDE müssen zu verstehen, und der Code automatisch vervollständigt;)
  • Sie auch die gleiche Technik für den Import verwenden können:

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

+0

Beachten Sie, dass dies die es6-Objekt Initialisiererverknüpfung verwendet - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer – chrismarx

Verwandte Themen