নোড.জেজে ফাইলগুলির মধ্যে পরিবর্তনগুলি ভাগ করবেন?


126

এখানে 2 টি ফাইল রয়েছে:

// main.js
require('./modules');
console.log(name); // prints "foobar"

// module.js
name = "foobar";

যখন আমার "ভার" নেই এটি কাজ করে। তবে যখন আমার আছে:

// module.js
var name = "foobar";

নাম মেইন.জেএস-এ সংজ্ঞায়িত করা হবে।

আমি শুনেছি যে বৈশ্বিক ভেরিয়েবলগুলি খারাপ এবং আপনি উল্লেখগুলির আগে ভাল "var" ব্যবহার করেন। তবে এটি কি এমন একটি ক্ষেত্রে যেখানে বিশ্বব্যাপী পরিবর্তনগুলি ভাল?

উত্তর:


184

গ্লোবাল ভেরিয়েবল প্রায় কখনই একটি ভাল জিনিস (হয়তো ব্যতিক্রম বা সেখানে আউট দুই ...)। এই ক্ষেত্রে, দেখে মনে হচ্ছে আপনি সত্যিই আপনার "নাম" পরিবর্তনশীল রফতানি করতে চান। যেমন,

// module.js
var name = "foobar";
// export it
exports.name = name;

তারপরে, মেইন জেজে ...

//main.js
// get a reference to your required module
var myModule = require('./module');

// name is a member of myModule due to the export above
var name = myModule.name;

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

1
@ jjoe64 নিশ্চিত না আপনি কী বলতে চাইছেন তা আমি অনুসরণ করি। আপনি exportsঅবজেক্টের মাধ্যমে আপনার যে কোনও মান কার্যকরভাবে ভাগ করতে পারেন ।
jmar777

7
ওপি জিজ্ঞাসা করছে যে মেইন.জেসগুলিতে কোনও ভেরিয়েবল সংজ্ঞায়িত করা যায়, এবং তারপরে মডিউল.জেজে ব্যবহার করা যায়। বারবার ব্যবহৃত পাথগুলি সংজ্ঞায়িত করার জন্য আমার একই প্রয়োজনীয়তা রয়েছে।
designermonkey

4
@ ডিজাইনারমনকি এই ক্ষেত্রে আপনি সম্ভবত কোনও ধরণের ফাইলের () ডি প্রয়োজন হতে পারে এমন ধরণের মানগুলির সাথে একটি কনফিগার অবজেক্ট রাখাই ভাল। মনে রাখবেন যে আপনি ঠিক করতে পারেনglobal.foo = 'bar' এবং তারপরে fooআপনি যে কোনও জায়গায় অ্যাক্সেস করতে পারেন ... তবে আমি যেমন আমার মূল উত্তরে বলেছিলাম, এটি প্রায় কোনও ভাল জিনিস নয়।
jmar777

তার জন্য ধন্যবাদ, আমি কীভাবে এটি করব তা বুঝতে পেরেছি এবং এটি একটি ট্রিট কাজ করে। আমার সঠিক ধারণাটি যাচাই করার জন্য ধন্যবাদ :)
ডিজাইনারমনকি

37

আমি এমন একটি দৃশ্যের সন্ধান করতে অক্ষম যেখানে একটি গ্লোবাল varসেরা বিকল্প, অবশ্যই আপনার একটি থাকতে পারে তবে এই উদাহরণগুলি দেখুন এবং আপনি এটি সম্পাদন করার আরও ভাল উপায় খুঁজে পেতে পারেন:

পরিস্থিতি 1: কনফিগার ফাইলগুলিতে স্টাফ রাখুন

আপনার কিছু মূল্য প্রয়োজন যা অ্যাপ্লিকেশন জুড়ে এটি একই, তবে এটি পরিবেশের (উত্পাদন, দেব বা পরীক্ষা) উপর নির্ভর করে পরিবর্তিত হয়, মেলারের ধরণ যেমন উদাহরণস্বরূপ, আপনার প্রয়োজন:

// File: config/environments/production.json
{
    "mailerType": "SMTP",
    "mailerConfig": {
      "service": "Gmail",
      ....
}

এবং

// File: config/environments/test.json
{
    "mailerType": "Stub",
    "mailerConfig": {
      "error": false
    }
}

(দেবের জন্যও অনুরূপ কনফিগারেশন তৈরি করুন)

কোন কনফিগারেশন লোড হবে তা স্থির করতে একটি প্রধান কনফিগারেশন ফাইল তৈরি করুন (এটি সমস্ত অ্যাপ্লিকেশনটিতে ব্যবহৃত হবে)

// File: config/config.js
var _ = require('underscore');

module.exports = _.extend(
    require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});

এবং এখন আপনি এই জাতীয় ডেটা পেতে পারেন :

// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));

পরিস্থিতি 2: একটি ধ্রুবক ফাইল ব্যবহার করুন

// File: constants.js
module.exports = {
  appName: 'My neat app',
  currentAPIVersion: 3
};

এবং এটি এইভাবে ব্যবহার করুন

// File: config/routes.js

var constants = require('../constants');

module.exports = function(app, passport, auth) {
  var apiroot = '/api/v' + constants.currentAPIVersion;
...
  app.post(apiroot + '/users', users.create);
...

পরিস্থিতি 3: ডেটা পেতে / সেট করতে একটি সহায়ক ফাংশন ব্যবহার করুন

এটির কোনও বড় অনুরাগী নন, তবে কমপক্ষে আপনি 'নাম' (ওপির উদাহরণটি উদ্ধৃত করে) এর ব্যবহার ট্র্যাক করতে পারেন এবং বৈধতাগুলিকে জায়গায় রাখতে পারেন।

// File: helpers/nameHelper.js

var _name = 'I shall not be null'

exports.getName = function() {
  return _name;
};

exports.setName = function(name) {
  //validate the name...
  _name = name;
};

এবং এটি ব্যবহার করুন

// File: controllers/users.js

var nameHelper = require('../helpers/nameHelper.js');

exports.create = function(req, res, next) {
  var user = new User();
  user.name = req.body.name || nameHelper.getName();
  ...

গ্লোবাল থাকার ব্যতীত অন্য কোনও সমাধান না থাকলে ব্যবহারের কেস হতে পারে var, তবে আপনি যদি নোড.জেএস ব্যবহার শুরু করেন (তবে আমি যেমন কিছুকাল আগে ছিলাম) চেষ্টা করলে সাধারণত আপনি এই অ্যাপ্লিকেশনটিতে ডেটা ভাগ করতে পারেন these আপনি যেভাবে ডেটা হ্যান্ডেল করেন সেভাবে সংগঠিত করার জন্য কারণ এটি সত্যিই অগোছালো হয়ে যেতে পারে।


আমি পরিস্থিতি 2 পছন্দ করেছি, তবে আমরা কী কথা বলার পরে এই মানগুলি পরিবর্তন করতে পারি? যেমন আমরা প্রায়শই করি, এনএমপি রান বিল্ড। অথবা বিল্ড করার পরে মানগুলি পরিবর্তন করতে সক্ষম হওয়ার কোনও উপায় কি আপনি জানেন?
কাশিফ উল্লাহ

@ কাশিফুল্লাহ নিশ্চিত নন যে আমি সরবরাহ করা তথ্যের সাহায্যে আপনার মন্তব্যের জবাব দিতে পেরেছি, আপনি সাইটে একটি নতুন প্রশ্ন যুক্ত করতে চাইতে পারেন
ফিলিপ পেরেইরা

16

আমাদের যদি একাধিক ভেরিয়েবল ভাগ করতে হয় তবে নীচের ফর্ম্যাটটি ব্যবহার করুন

//module.js
   let name='foobar';
   let city='xyz';
   let company='companyName';

   module.exports={
    name,
    city,
    company
  }

ব্যবহার

  // main.js
    require('./modules');
    console.log(name); // print 'foobar'

2
বিভ্রান্তি থেকে দূরে থাকা কেবলমাত্র একটি দ্রুত নোট যা প্রথম স্থানে দেখা দিতে পারে: মডিউল.এক্সপোর্টগুলি কী ব্যবহার করা উচিত! আপনার জেএস ফাইলটিকে যাই বলা হোক না কেন (উদা: গ্লোবাল.জেএস)। মডিউল একটি নোড অবজেক্ট যা বিশ্বব্যাপী সুযোগে বিদ্যমান! [সুতরাং গ্লোবাল.জেএসের মধ্যে আমরা মডিউল.এক্সপোর্টগুলি ব্যবহার করি = .....]
মোহাম্মদ আল্লাল

আপনি 'লেট' সরিয়ে ফেললে এটি সফল হবে, এবং "মডিউল.এক্সপোর্টস .." দরকার নেই
আহমদ

6

যে কোনও ভেরিয়েবলকে একটি অবজেক্ট হিসাবে ভাগ করতে চান সেভ করুন। তারপরে এটি লোড করা মডিউলে পাস করুন যাতে এটি অবজেক্টের রেফারেন্সের মাধ্যমে পরিবর্তনশীল অ্যাক্সেস করতে পারে ..

// main.js
var myModule = require('./module.js');
var shares = {value:123};

// Initialize module and pass the shareable object
myModule.init(shares);

// The value was changed from init2 on the other file
console.log(shares.value); // 789

অন্য ফাইলটিতে ..

// module.js
var shared = null;

function init2(){
    console.log(shared.value); // 123
    shared.value = 789;
}

module.exports = {
    init:function(obj){
        // Save the shared object on current module
        shared = obj;

        // Call something outside
        init2();
    }
}

1

ভেরিয়েবলের সাথে বা ছাড়াই ঘোষিত একটি ভেরিয়েবল গ্লোবাল অবজেক্টের সাথে সংযুক্ত হয়ে যায়। এটি নোডে ভেরিয়েবলটি ভেরিয়েবলগুলি না করে বৈশ্বিক ভেরিয়েবল তৈরির ভিত্তি। ভেরিয়েবলগুলি ভেরাব্যওয়ার্ড সহ ঘোষিত যখন একটি মডিউলে স্থানীয় থাকে।

আরও বোঝার জন্য এই নিবন্ধটি দেখুন - https://www.hacksparrow.com/global-variables-in-node-js.html


3
এই খণ্ডগুলি কি বিরোধী? 1) "ভেরিয়েবলের সাথে বা ছাড়াই ঘোষিত একটি চলক গ্লোবাল অবজেক্টের সাথে সংযুক্ত হয়ে গেছে" " এবং 2) "ভেরিয়েবলের সাথে ঘোষিত ভেরিয়েবলগুলি একটি মডিউলে স্থানীয় থাকে" "
বাল্ডএগল

1

একটি ভিন্ন মতামত নিয়ে, আমি মনে করি যে globalভেরিয়েবলগুলি সেরা পছন্দ হতে পারে যদি আপনি আপনার কোডটি প্রকাশ করতে যাচ্ছেন তবে আপনি npmনিশ্চিত হতে পারবেন না যে সমস্ত প্যাকেজগুলি আপনার কোডের একই প্রকাশ করছে। সুতরাং আপনি যদি কোনও singletonবিষয় রফতানির জন্য কোনও ফাইল ব্যবহার করেন তবে এটি এখানে সমস্যার কারণ হবে।

আপনি চয়ন করতে পারেন global, require.mainঅথবা অন্য কোন বস্তু যা ফাইল জুড়ে ভাগ করা হয়েছে।

আরও কিছু ভাল সমাধান আছে কিনা আমাকে বলুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.