মডিউল.এক্সপোর্টের অন্য ফাংশন থেকে মডিউল.এক্সপোর্টের মধ্যে একটি "স্থানীয়" ফাংশন কল করুন?


326

আপনি কীভাবে কোনও 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: অবজেক্ট # এর কোনও পদ্ধতি 'foo' নেই

যদি আমি পরিবর্তন this.foo()করার জন্য শুধু foo()আমি পাবেন:

রেফারেন্সএরর: foo সংজ্ঞায়িত করা হয় না


4
আমি আপনার কোড পরীক্ষা করেছি এবং কোনও ত্রুটি নেই। বার ফাংশন অপরিজ্ঞাত করে দেয় কারণ কোনও রিটার্নের বিবৃতি নেই। আপনি কি নিশ্চিতরূপে পরীক্ষা করছেন?
ফেরচি

1
নোড সংস্করণে পরীক্ষিত এবং v8.12.0ত্রুটিটি আর ছুঁড়ে না। barকোনও রিটার্নের বিবৃতি নেই তাই চলমান console.log(bla.bar())কেবল ফিরে আসেundefined
ভ্লাদনিএকসু

উত্তর:


350

পরিবর্তন this.foo()করুনmodule.exports.foo()


1
@ নামনিগুইন কলিংটি exports.foo()কিছুটা বিশ্রী এবং পড়া খুব কঠিন বলে মনে হচ্ছে।
আফশিন মেহরাবানি

4
আমি মনে করি এটি গৃহীত উত্তরের চেয়ে ভাল। আপনি যদি রফতানির সুযোগের বাইরে ফাংশনগুলি সংজ্ঞায়িত করেন তবে এটি অতিরিক্ত মাত্রার ইন্ডিয়ারেশান যুক্ত করে এবং এটি কখনও কখনও কাম্য হতে পারে তবে এটি আরও জটিল করে তোলে, রিফ্যাক্টর যেমন, ফাংশনটির নাম পরিবর্তন করে, ফাংশনটির ব্যবহার অনুসন্ধান করা ইত্যাদি
পিয়ের হেনরি

1
প্রশ্নের সরাসরি উত্তর
Kermit_ice_tea

8
module.exports.foo()এবং exports.foo()Node.js v5.8.0 এর সাথে আমার জন্য কাজ করবেন না।
betweenbrain

14
निर्यात.ফু () কাজ করছে না তবে মডিউল.export.foo ()
নোডজেএস v6.9.1 এর

191

আপনি module.exportsব্লকের বাইরে আপনার কার্যগুলি ঘোষণা করতে পারেন could

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

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

তারপর:

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

11
আমি যদি পদ্ধতি থেকে অবজেক্টের বৈশিষ্ট্য অ্যাক্সেস করতে চাইতাম তবে কী হবে?
রকস্টার

1
আমি টাইপ এরিয়ার পাচ্ছি: আমি যখন এটি করেছি তখন আপনার ক্লাস.ইউমথোদ কোনও ফাংশন নয়। আমি নোড সংস্করণ ব্যবহার করছি 6.9.1। আপনার কি রিটার্ন স্টেটমেন্ট থাকতে হবে? আমার সমস্ত কোড ফাংশনে অ্যাসিঙ্ক হওয়ার কারণে আমার কাছে রিটার্নের বিবৃতি নেই।
ব্রেট ম্যাথ

1
- বিভিন্ন শৈলীর নিস তুলনা gist.github.com/kimmobrunfeldt/10848413
Tadas ভি

খুব সুন্দর বাস্তবায়ন! +1
রিয়েলসলেও

2
অথবা, আরও সংক্ষিপ্তভাবে ES6 ব্যবহার করে,module.exports = { foo, bar, }
আমাকে এর সম্পর্কে

118

এটি আরও সংক্ষিপ্ত এবং পঠনযোগ্য করার জন্য আপনি এটিও করতে পারেন। আমি বেশ কয়েকটি ভাল লিখিত ওপেন সোর্সযুক্ত মডিউলগুলিতে এটি দেখেছি:

var self = module.exports = {

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

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

}

এই নোড.জেএস সংস্করণটি কি নির্দিষ্ট? আমি v5.8.0 দিয়ে এটি চেষ্টা করে যাচ্ছি এবং এটি লগইন করছে।
betweenbrain

1
@ ডাবলজোশ করেছেন ... আপনি প্রশ্নটি পড়েছেন? এটি জিজ্ঞাসা করছে যে আপনি কীভাবে একজনকে অন্যের থেকে রফতানি ফাংশন বলবেন। অ্যাক্সেস সীমাবদ্ধতার সাথে এর কোনও যোগসূত্র নেই।
ফান্ড মনিকার লসুইট

1
হ্যাঁ আমি এটি পড়েছি, দয়া করে পুনরায় পড়ুন। এই উত্তরটি foo () মডিউলের সাথে রফতানি করে, যা কেবলমাত্র "মডিউল" এর মধ্যে ডাকা "স্থানীয়" ফাংশনের বিন্দুটির বিপরীতে যায়।
doublejosh

66

আপনি (মডিউল) এক্সপোর্টের বাইরে মডিউলের গ্লোবাল স্কোপের একটি রেফারেন্সও সংরক্ষণ করতে পারেন ome সামুদ্রিক সংজ্ঞা:

var _this = this;

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

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

এটি আরও পরিষ্কার সমাধান!
ইভানজহ

কোন _this প্রয়োজনীয়তার এবং আপনি কেবল এই ব্যবহার করতে পারেন যেখানে আপনি এটি প্রয়োজন
Yuki,

thisসরাসরি ব্যবহার করা হয়েছে, ঘোষণা করার দরকার নেই_this
দারিয়াস

1
এই পরামর্শটি একবার কার্যকর thisহয় এখন আর সঠিক নয় this। (প্রতিশ্রুতি এবং
কলব্যাকস

আমি এই সমাধানটি সবচেয়ে পছন্দ করি কারণ এটি নোডজেএস মডিউলগুলিতে স্কোপিংয়ের একটি উদাহরণ দেয়।
মাইগুয়েলমোরিন

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

নোড.জেএস সংস্করণ 13 দিয়ে শুরু করে আপনি ইএস 6 মডিউলগুলির সুবিধা নিতে পারেন ।

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_casing


এবং এই পদ্ধতির মাধ্যমে কীভাবে কোনও স্থিতিশীল পদ্ধতি কল করে?
প্লিজিক্সার

@ কোডোডগোড যেমন আপনি অন্য কোনও স্থির পদ্ধতিতে কল করবেন ঠিক তেমন এটি কল করুন। এই ক্ষেত্রে, যদি fooস্ট্যাটিক ছিল আপনি এটা ভিতর থেকে কল করবে barভালো: MyClass.foo()
m.spyratos

হ্যাঁ আমি এটি পেয়েছি, তবে আপনি কীভাবে এটিকে এমন কোনও নিয়ন্ত্রণকারীর কাছ থেকে কল করবেন যা এটি এর মতো আমদানি করছে ... কনট ওএ অ্যাকাউন্টস = প্রয়োজন ("...");
প্লিজিক্সার

আপনি প্রকৃত ক্লাসটি রফতানি করতে পারেন, ক্লাসের উদাহরণ নয়। এইভাবে আপনি এর স্থির পদ্ধতি ব্যবহার করতে পারেন। এরপরে যদি আপনাকে এর উদাহরণ পদ্ধতিগুলি ব্যবহার করার প্রয়োজন হয় তবে আপনাকে আপনার নিয়ামকের ক্লাসটি ইনস্ট্যান্ট করতে হবে।
m.spyratos

6

আপনার সমস্যাটি সমাধানের জন্য, আমি ব্লেজ.জেসগুলিতে কিছু পরিবর্তন করেছি এবং এটি কাজ করছে,

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
ফাংশন বারে, এটি.ফু () কাজ করে না ... এটির জন্য
ফুও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.