প্রয়োজনীয় যুক্তিগুলি পাস করা (মডিউল লোড করার সময়)


113

প্রয়োজনীয়তা ব্যবহার করে কোনও মডিউল লোড করার সময় কি যুক্তিগুলি পাস করা সম্ভব?

আমার মডিউল, login.js রয়েছে যা লগইন কার্যকারিতা সরবরাহ করে provides এটির জন্য একটি ডাটাবেস সংযোগ প্রয়োজন এবং আমি চাই আমার একই সমস্ত ডাটাবেস সংযোগটি আমার সমস্ত মডিউলগুলিতে ব্যবহার করা হোক। এখন আমি একটি ফাংশন লগইন.সেটডেটাবেস (...) রফতানি করি যা আমাকে একটি ডাটাবেস সংযোগ নির্দিষ্ট করতে দেয় এবং এটি ঠিক কাজ করে। আমি বরং মডিউলটি লোড করার সময় ডাটাবেস এবং অন্য কোনও প্রয়োজনীয়তাগুলি পাস করব।

var db = ...
var login = require("./login.js")(db);

আমি নোডজেএসের সাথে বেশ নতুন এবং সাধারণত জাভা এবং স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করে বিকাশ করি, তাই হ্যাঁ ... এটি কনস্ট্রাক্টর ইনজেকশন) :) উপরে বর্ণিত কোডটির মতো কিছু করা কি সম্ভব?


আমি এই প্রশ্নের উত্তরগুলি দেখার পরামর্শ দিই । আমার উত্তরে নির্দেশিত হিসাবে, একটি সাধারণ প্রতিমা হ'ল appপ্রয়োজনীয় মডিউলগুলিতে বস্তুটি পাস করা ।
ডেভিড ওয়েলডন

এর পরিবর্তে এই সব যুক্তি ডিবি জন্য ক্ষণস্থায়ী করছেন, আপনি একটি ব্যবহার করতে পারে Singleton বাস্তবায়ন ও যেখানে প্রয়োজন db.getInstance () কল করুন।
উলফগারপ্রো

উত্তর:


236

এই উত্তরে আপনার মন্তব্যের ভিত্তিতে , আপনি যা করার চেষ্টা করছেন তা আমি করি:

module.exports = function (app, db) {
    var module = {};

    module.auth = function (req, res) {
        // This will be available 'outside'.
        // Authy stuff that can be used outside...
    };

    // Other stuff...
    module.pickle = function(cucumber, herbs, vinegar) {
        // This will be available 'outside'.
        // Pickling stuff...
    };

    function jarThemPickles(pickle, jar) {
        // This will be NOT available 'outside'.
        // Pickling stuff...

        return pickleJar;
    };

    return module;
};

আমি প্রায় আমার সমস্ত মডিউল এর মত সুন্দর গঠন করি। আমার জন্য ভাল কাজ মনে হচ্ছে।


appযুক্তিটি কি প্রয়োজনীয় বা আমি এটি বাদ দিতে পারি? আমার মডিউলটি এই অ্যাপ্লিকেশনটি যুক্তির সুস্পষ্টভাবে ব্যবহার করবে না, তবে কোনও অভ্যন্তরীণ জিনিসের জন্য নোড.জেএস দ্বারা এটি প্রয়োজন কিনা তা আমি জানি না। যদি এটি ঠিক থাকে তবে আমার মডিউল ঘোষণাটি এর মতো হবে:module.exports = function (db) {
ইউলিসেস আলভেস

এটি একটি এক্সপ্রেস অ্যাপ্লিকেশনটির জন্য নির্দিষ্ট ছিল, সুতরাং অবশ্যই প্রয়োজনীয় নয় definitely
ভাসমান

@floatingLomas পাইথন মধ্যে ধারাবাহিকতাতে প্রক্রিয়া জরান বলা হয়: stackoverflow.com/questions/11218477/...
SadSeven

1
সুতরাং আপনি যদি মডিউলটি বেশ কয়েকবার উল্লেখ করেন তবে কী হবে? প্রথমটি require(mymodule)(myargs)আপনাকে কাজ করার জন্য একটি মডিউল দেবে। তবে আপনি অন্য মডিউল থেকে অন্য কোথাও রেফারেন্স যদি ?? প্রাথমিক সিস্টেমে একটি ক্যাশে জড়িত বলে মনে হয়, তবে এই সিস্টেমে ক্যাশে পরবর্তী কলগুলিতে খালি জেনারেটর পদ্ধতিটি ফিরিয়ে দেয় require()এবং আপনি যদি অর্গগুলি পাস করেন require()(someargs)তবে একটি ভিন্ন মডিউল ফিরে পাবেন ... সম্ভবত আমি অনুপস্থিত কিছু
টম এইচ

2
@ টম এই ক্ষেত্রে, আপনি এটি ক্যাশে করতে চান। এটি করার জন্য আপনার var module;রফতানি কার্যের বাইরে থাকতে হবে এবং তারপরেই আপনি প্রবেশ করার সাথে সাথেই moduleইতিমধ্যে সংজ্ঞায়িত কিনা তা পরীক্ষা করতে চান এবং যদি তাই হয় তবে কেবল এটি ফিরিয়ে দিন (এবং না হলে এটি আরম্ভ করুন)। যে জানার জন্য?
floatingLomas

37

এটি এখনও লোকের পক্ষে কার্যকর হবে কিনা তা আমি নিশ্চিত নই, তবে ES6 এর সাথে আমার এটি করার একটি উপায় রয়েছে যা আমি পরিষ্কার এবং দরকারী বলে মনে করি।

class MyClass { 
  constructor ( arg1, arg2, arg3 )
  myFunction1 () {...}
  myFunction2 () {...}
  myFunction3 () {...}
}

module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }

এবং তারপরে আপনি আপনার প্রত্যাশিত আচরণ পান।

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )

32

হ্যাঁ. আপনার loginমডিউলে, কেবলমাত্র একটি একক ফাংশন রফতানি করুন dbযা তার আর্গুমেন্ট হিসাবে গ্রহণ করে । উদাহরণ স্বরূপ:

module.exports = function(db) {
  ...
};

1
আমি এটি চেষ্টা করেছিলাম। লগইন.জেজে module.exports = function(app,db) { ... } module.exports.auth = function(req,res) { ... authentication stuff } এটি "বেনামে" ফাংশনটি কল করে appএবং dbভেরিয়েবলগুলি সেট করে তবে এটি করার সময় আমার অ্যাপ্লিকেশনটি authফাংশনটি খুঁজে পাবে না । আমি কি ভুল করছি? আমি বেনামে ফাংশনটি সরিয়ে authফাংশনটি আবার অ্যাক্সেসযোগ্য হয়ে ওঠে।
আন্দ্রেস সেলেনওয়াল

জাভাস্ক্রিপ্টের সমস্ত কিছুর মতো exportsএকটি বস্তু। আপনি এটিতে বৈশিষ্ট্যগুলি বরাদ্দ করতে পারেন (একাধিক রফতানি), বা আপনি এটিকে কোনও মান নির্ধারণ করতে পারেন। দেখে মনে হচ্ছে আপনি কোনও ক্রিয়াকলাপে রফতানি বরাদ্দ করেছেন তবে তারপরে রফতানির জন্য আপনি যে ফাংশনটি অর্পণ করেছেন তাকে সম্পত্তি হিসাবে নির্ধারিত করে uth সুতরাং আপনার এমন কাজ করা দরকার var auth = require("./login.js").authযা আপনি যা চান তা নাও হতে পারে। আপনি যদি আসল প্রশ্ন থেকে প্যাটার্নটি ব্যবহার করতে চান তবে একক রফতানীর মানকে আঁকিয়ে রাখা সম্ভবত সেরা। যদি এটি এখনও বোঝা না যায় তবে আমি আমার দিকে নজর দেওয়ার জন্য একটি টুকরো পোস্ট করার পরামর্শ দিই।
ডেভিড ওয়েল্ডন

1
এটি আবার পড়ার পরে, মনে হচ্ছে আপনি authকোনও exportsবস্তুর সম্পত্তি হিসাবে নির্ধারিত হয়ে থাকতে পারেন , এবং তারপরে পরে exportsকোনও ফাংশন আপনাকে অর্পণ করা মডিউলে (এইভাবে পূর্ববর্তী কার্যভারকরণটি ওভাররাইড করা)। আপনি যদি অর্পণের ক্রমটিকে বিপরীত করেন তবে আপনার authপ্রত্যাশা অনুযায়ী ফাংশনটি অ্যাক্সেস করতে সক্ষম হওয়া উচিত । আবার কোডটি না দেখে এটি বলা শক্ত।
ডেভিড ওয়েলডন

1
আপনার সাহায্যের জন্য অসংখ্য ধন্যবাদ. আমি যা বুঝতে পারি নি তা হ'ল আপনি প্রয়োজনীয়তার জন্য লক্ষ্য রেখেছিলেন ('লগইন') a আমি যদিও কোন পার্থক্য ছিল var login = require('login')এবং var login = require('login')(app), কিন্তু একটি বিশাল পার্থক্য আছে, সেখানে ফিরে বেনামী ফাংশনে কোন ম্যাজিক, এটা শুধু আরেকটি ফাংশন / অবজেক্ট। একটি থাকার পরিবর্তে, module.exports.authঅসাধারণ ফাংশন এখন প্রমাণীকরণ ফাংশন (অন্যদের মধ্যে) প্রদান করে, অর্থাৎ return { auth: authFunction, login: loginFunction}। সুতরাং এখন এটি কাজ করে। ধন্যবাদ।
আন্দ্রেয়াস সেলেনওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.