Deklarasikan beberapa module.exports di Node.js


243

Apa yang saya coba capai adalah membuat satu modul yang berisi banyak fungsi di dalamnya.

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

Masalah yang saya miliki adalah bahwa firstParamini adalah tipe objek dan secondParamstring URL, tetapi ketika saya memilikinya selalu mengeluh bahwa tipenya salah.

Bagaimana saya bisa mendeklarasikan beberapa module.exports dalam kasus ini?


2
Saya jelas kehilangan beberapa bagian penting dari paradigma ini karena itu membuat saya bingung apa yang diperlukan untuk membuatnya bekerja.
Joshua Pinter

Jawaban:


540

Anda dapat melakukan sesuatu seperti:

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

Atau hanya:

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

Kemudian dalam skrip panggilan:

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

25
Selalu gunakan module.exports = {}dan tidak module.method = .... stackoverflow.com/a/26451885/155740
Scotty

9
Saya tidak menggunakan di module.methodmana saja di sini ... hanya exports.method, yang hanya referensi module.exports.method, jadi berperilaku dengan cara yang sama. Satu-satunya perbedaan adalah kita tidak mendefinisikan module.exports, jadi defaultnya adalah {}, kecuali saya salah.
mash

@mash ini akan bekerja di file lain dengan menggunakan: var otherMethod = require('module.js')(otherMethod);? Yaitu, akan baris yang memerlukan otherMethodfungsi sama seperti jika itu adalah satu-satunya fungsi pada halaman dan ekspor telah: module.exports = secondMethod;?
YPCrumble

3
@YPCrumble bisa Anda lakukan var otherMethod = require('module.js').otherMethod.
mash

Bisakah Anda menunjukkan kecocokan yang dibutuhkan di program lain yang sesuai dengan itu?
NealWalters

138

Untuk mengekspor beberapa fungsi, Anda dapat mencantumkannya seperti ini:

module.exports = {
   function1,
   function2,
   function3
}

Dan kemudian untuk mengaksesnya di file lain:

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

Dan kemudian Anda dapat memanggil setiap fungsi dengan memanggil:

myFunctions.function1
myFunctions.function2
myFunctions.function3

1
Jawaban sempurna, jawaban ini harus saya tandai sebagai jawaban yang tepat.
Wisnu Ranganathan

Bagaimana cara kalian menggunakannya require("./lib/file.js")? Saya perlu menggunakan require("../../lib/file.js"), kalau tidak itu tidak akan berhasil.
Antonio Ooi

11
Anda juga dapat melakukan ini ketika mengaksesnya: const { function1, function2, function3 } = require("./lib/file.js")yang memungkinkan Anda untuk memanggil mereka secara langsung (misalnya, function1bukan myFunctions.function1)
David Yeiser

Ini adalah pendekatan paling bersih dan paling sederhana!
Zeus

42

selain jawaban @mash saya sarankan Anda untuk selalu melakukan hal berikut:

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

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

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

Perhatikan di sini:

  • Anda dapat menelepon methoddari otherMethoddan Anda akan membutuhkan ini banyak
  • Anda dapat dengan cepat menyembunyikan metode sebagai pribadi saat dibutuhkan
  • Ini lebih mudah bagi sebagian besar IDE untuk memahami dan melengkapi kode Anda secara otomatis;)
  • Anda juga dapat menggunakan teknik yang sama untuk impor:

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


Perhatikan bahwa ini menggunakan pintasan penginisialisasi objek es6 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
chrismarx

1
Ini adalah jawaban yang lebih baik karena alamat metode akses dari metode lain. Terima kasih telah menunjukkannya.
Jeff Beagley

15

Ini hanya untuk referensi saya karena apa yang saya coba capai dapat dicapai dengan ini.

Dalam module.js

Kita bisa melakukan sesuatu seperti ini

    module.exports = function ( firstArg, secondArg ) {

    function firstFunction ( ) { ... }

    function secondFunction ( ) { ... }

    function thirdFunction ( ) { ... }

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

    }

Dalam 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

Jika file ditulis menggunakan ekspor ES6, Anda dapat menulis:

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

8

Salah satu cara yang dapat Anda lakukan adalah membuat objek baru dalam modul alih-alih menggantinya.

sebagai contoh:

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

dan untuk menelepon

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

Bagi saya ini merupakan pendekatan yang sangat sederhana dibandingkan dengan jawaban lain! Really NIce
HN Singh

6

Anda dapat menulis fungsi yang secara manual mendelegasikan antara fungsi lain:

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

Ini adalah cara untuk mencapai fungsi berlebih, tapi tidak terlalu ... elegan. Saya pikir jawaban Mash lebih bersih dan menunjukkan niat yang lebih baik.
Nepoxx

5

Gunakan ini

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

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();

3

Dua jenis modul impor dan ekspor.

tipe 1 (module.js):

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

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

tipe 1 (main.js):

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

tipe 2 (module.js):

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

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

tipe 2 (main.js):

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

Bagaimana cara menggunakan modul impor?

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

3

Anda juga dapat mengekspornya seperti ini

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

atau untuk fungsi anonim seperti ini

    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

Ada banyak cara untuk melakukan ini, satu cara disebutkan di bawah ini. Anggap saja Anda memiliki file .js seperti ini.

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

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

Anda dapat mengekspor fungsi-fungsi ini menggunakan cuplikan kode berikut,

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

Dan Anda dapat menggunakan fungsi yang diekspor menggunakan potongan kode ini,

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

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

Saya tahu ini adalah jawaban yang terlambat, tetapi harap ini membantu!


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

Jika Anda mendeklarasikan kelas dalam file modul alih-alih objek sederhana

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

File Utama: index.js

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

0

Anda dapat menggunakan pendekatan ini juga

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

atau

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

0

Menambahkan di sini untuk seseorang untuk membantu:

blok kode ini akan membantu menambahkan beberapa plugin ke dalam cypress index.js Plugins -> cypress-ntlm-auth dan cypress env pemilihan file

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;
};
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.