मॉड्यूल में एक अन्य समारोह से मॉड्यूल में "स्थानीय" समारोह को बुलाओ।


327

किसी module.exportsघोषणा में दूसरे फ़ंक्शन के भीतर से किसी फ़ंक्शन को कैसे कहते हैं ?

app.js
var bla = require('./bla.js');
console.log(bla.bar());
bla.js
module.exports = {

  foo: function (req, res, next) {
    return ('foo');
  },

  bar: function(req, res, next) {
    this.foo();
  }

}

मैं फंक्शन के fooभीतर से फंक्शन को एक्सेस करने की कोशिश कर रहा हूं bar, और मुझे मिल रहा है:

TypeError: Object # का कोई तरीका 'foo' नहीं है

अगर मैं बदल this.foo()जाता हूँ तो मुझे बस foo():

ReferenceError: foo परिभाषित नहीं है


4
मैंने आपके कोड का परीक्षण किया है और इसमें कोई त्रुटि नहीं है। बार फ़ंक्शन अपरिभाषित होता है क्योंकि कोई रिटर्न स्टेटमेंट नहीं होता है। क्या आप वाकई सही परीक्षण कर रहे हैं?
फेरि

1
नोड संस्करण में परीक्षण किया गया v8.12.0और अब त्रुटि नहीं फेंकता है। barकोई रिटर्न स्टेटमेंट नहीं है, इसलिए console.log(bla.bar())केवल रिटर्न चल रहा हैundefined
VladNeacsu 19

जवाबों:


351

बदलें this.foo()करने के लिएmodule.exports.foo()


1
@NamNguyen कॉलिंग exports.foo()थोड़ी अजीब और पढ़ने में कठिन लगती है।
अफशीन मेहरबानी

4
मुझे लगता है कि यह स्वीकृत उत्तर से बेहतर है। यदि आप निर्यात क्षेत्र के बाहर के कार्यों को परिभाषित करते हैं, तो यह अप्रत्यक्ष के एक अतिरिक्त स्तर को जोड़ता है, और जबकि यह कभी-कभी वांछनीय हो सकता है, यह इसे और अधिक जटिल बनाता है, रिफ्लेक्टर के लिए, उदाहरण के लिए फ़ंक्शन का उपयोग करने के लिए फ़ंक्शन का नाम बदलें, आदि
पियरे हेनरी

1
इस सवाल का सीधा जवाब है
Kermit_ice_tea

8
module.exports.foo()और exports.foo()मेरे लिए Node.js v5.8.0 के साथ काम न करें।
बजे

14
Export.foo () काम नहीं कर रहा है, लेकिन मॉड्यूल .exports.foo () NodeJS v6.9.1 के साथ काम कर रहा है
आर। कैंटर यानबाकन

191

आप module.exportsब्लॉक के बाहर अपने कार्यों की घोषणा कर सकते हैं ।

var foo = function (req, res, next) {
  return ('foo');
}

var bar = function (req, res, next) {
  return foo();
}

फिर:

module.exports = {
  foo: foo,
  bar: bar
}

11
क्या होगा यदि मैं विधि से ऑब्जेक्ट के गुणों तक पहुंचना चाहता हूं?
रॉकस्टार

1
जब मैं ऐसा करता हूं तो मुझे TypeError मिल रहा है: yourClass.youMethod एक फ़ंक्शन नहीं है। मैं नोड संस्करण 6.9.1 का उपयोग कर रहा हूं। क्या आपके पास रिटर्न स्टेटमेंट होना चाहिए? मेरे पास रिटर्न स्टेटमेंट नहीं हैं क्योंकि मेरे सभी कोड फ़ंक्शन में async हैं।
ब्रेट मैथ

1
विभिन्न शैलियों की अच्छी तुलना - gist.github.com/kimmobrunfeldt/10848413
वी।

बहुत अच्छा कार्यान्वयन! +1
realnsleo

2
या, अधिक संक्षेप में ईएस 6 का उपयोग करते हुए,module.exports = { foo, bar, }
लेट मी टिंक अबाउट इट

118

आप इसे अधिक संक्षिप्त और पठनीय बनाने के लिए भी कर सकते हैं। यह वही है जो मैंने कई लिखित खुले खट्टे मॉड्यूल में किया है:

var self = module.exports = {

  foo: function (req, res, next) {
    return ('foo');
  },

  bar: function(req, res, next) {
    self.foo();
  }

}

क्या यह Node.js संस्करण विशिष्ट है? मैं v5.8.0 के साथ यह कोशिश कर रहा हूं और यह अपरिभाषित है।
जुलाब

1
@doublejosh किया ... क्या आपने प्रश्न पढ़ा है? यह पूछ रहा है कि आप एक निर्यात किए गए फ़ंक्शन को दूसरे से कैसे कहते हैं। इसका एक्सेस प्रतिबंधों से कोई लेना-देना नहीं है
निधि मोनिका का मुकदमा

1
हां मैंने इसे पढ़ा, कृपया फिर से पढ़ें। यह उत्तर मॉड्यूल के साथ निर्यात किए गए फू () को बनाता है, जो केवल मॉड्यूल में "स्थानीय" फ़ंक्शन के बिंदु के खिलाफ जाता है।
डबलजॉश

66

आप मॉड्यूल के बाहर मॉड्यूल के वैश्विक दायरे के संदर्भ को भी बचा सकते हैं (मॉड्यूल।) Export.somemodule परिभाषा:

var _this = this;

exports.somefunction = function() {
   console.log('hello');
}

exports.someotherfunction = function() {
   _this.somefunction();
}

यह अधिक क्लीनर समाधान है!
इवानज डे

_this के लिए कोई ज़रूरत नहीं है और आप बस इसका उपयोग कर सकते हैं जहां आपको इसकी आवश्यकता है
Yuki

thisसीधे इस्तेमाल किया जाता है, घोषित करने की आवश्यकता नहीं है_this
डेरियस

1
यह सुझाव उपयोगी है एक बार thisअब अधिकार नहीं है this। (वादे और
आह्वान

मुझे यह समाधान सबसे अच्छा लगता है क्योंकि यह NodeJS मॉड्यूल में स्कूपिंग का एक उदाहरण देता है।
मिगुएलमोरिन

40

एक अन्य विकल्प, और ओपी की मूल शैली के करीब, वह वस्तु है जिसे आप एक चर और संदर्भ में निर्यात करना चाहते हैं, जो उस चर में अन्य तरीकों से कॉल करने के लिए संदर्भित करता है। फिर आप उस चर को निर्यात कर सकते हैं और आप जाने के लिए अच्छे हैं।

var self = {
  foo: function (req, res, next) {
    return ('foo');
  },
  bar: function (req, res, next) {
    return self.foo();
  }
};
module.exports = self;

25
const Service = {
  foo: (a, b) => a + b,
  bar: (a, b) => Service.foo(a, b) * b
}

module.exports = Service

3
यह विशेष रूप से उपयोग करने योग्य है क्योंकि आपके कोड में कॉलिंग है Service.foo(), और आपका क्लाइंट कोड भी Service.foo()उसी नामकरण के साथ कॉलिंग होगा ।
विंस बॉड्रेन

यह एक सही जवाब है!
जयंत वार्ष्णेय

16

Node.js संस्करण 13 से शुरू होकर आप ES6 मॉड्यूल का लाभ उठा सकते हैं ।

export function foo() {
    return 'foo';
}

export function bar() {
    return foo();
}

कक्षा दृष्टिकोण के बाद:

class MyClass {

    foo() {
        return 'foo';
    }

    bar() {
        return this.foo();
    }
}

module.exports = new MyClass();

यह नोड के मॉड्यूल कैशिंग के कारण केवल एक बार ही कक्षा को बंद कर देगा:
https://nodejs.org/api/modules.html#modules_caching


और इस दृष्टिकोण के साथ एक स्थिर विधि कैसे कह सकती है?
प्लिक्सर

@CodeofGod बस इसे कॉल करें क्योंकि आप किसी अन्य स्थिर विधि को कॉल करेंगे। इस स्थिति में, यदि fooआप स्थिर थे तो आप इसे barइस तरह से अंदर से कॉल करेंगे MyClass.foo():।
m.spyratos

हाँ, मुझे वह मिलता है, लेकिन आप इसे एक नियंत्रक से कैसे कहेंगे जो इसे आयात कर रहा है ... const oAccounts = आवश्यकता ("...");
प्लिक्सएक्सर

आप वास्तविक वर्ग का निर्यात कर सकते हैं, वर्ग का उदाहरण नहीं। इस तरह आप इसके स्थैतिक तरीकों का उपयोग कर सकते हैं। यदि आपको इसके उदाहरण के तरीकों का उपयोग करने की आवश्यकता है, तो आपको अपने नियंत्रक में कक्षा को तुरंत भेजना होगा।
m.spyratos

6

आपके मुद्दे को ठीक करने के लिए, मैंने bla.js में कुछ बदलाव किए हैं और यह काम कर रहा है,

var foo= function (req, res, next) {
  console.log('inside foo');
  return ("foo");
}

var  bar= function(req, res, next) {
  this.foo();
}
module.exports = {bar,foo};

और app.js में कोई संशोधन नहीं

var bla = require('./bla.js');
console.log(bla.bar());

1
फ़ंक्शन बार में, यह .foo () काम नहीं करता है ... इसे फू () करने की आवश्यकता है
फाल्को
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.