node.js গ্লোবাল ভেরিয়েবল?


208

আমি এখানে জিজ্ঞাসা করেছি: নোড.জেসের উত্তরাধিকার প্রয়োজন?

এবং আমাকে বলা হয়েছিল যে আমি বিশ্বব্যাপী স্কোয়ারে ভ্যারিয়েবল সেট করে রাখতে পারি।

এটি আমার পক্ষে কাজ করে না।

অর্থাৎ,

_ = require('underscore');

প্রয়োজনীয় ফাইলগুলিতে _ উপলব্ধ করে না। আমি এক্সপ্রেস দিয়ে সেট করতে পারি app.setএবং এটি অন্য কোথাও পাওয়া যায়।

কেউ কি নিশ্চিত হতে পারে যে এটি কাজ করার কথা? ধন্যবাদ।


আপনার উপরের রেখাটি কোথায় আছে?
জান হানিয়ে

3
আমি মনে করি আপনার আগের প্রশ্নের উত্তরটি যদি কাজ না করে তবে আপনার একটি নতুন প্রশ্ন শুরু করা উচিত নয়। বরং সেখানে একটি মন্তব্য যুক্ত করুন এবং গৃহীত ট্যাগটি সরিয়ে দিন।
পরকীয়ার

5
কেবল এটিকে সম্পাদনা করা এটি বর্তমানে সক্রিয় প্রশ্ন তালিকায় উপস্থিত হয়।
এমএকে

3
ব্যবহার exports। এটা অনেক বেশি ভাল।
এমারম্যান

1
আপনার "কঠোর ব্যবহার" থাকায় এটি কার্যকর হয় না; আপনার ফাইলের শীর্ষে। এটি আমার জন্য এমন কাজ করে।
গেজা তুরি

উত্তর:


237

আপনি এর globalমতো ব্যবহার করতে পারেন :

global._ = require('underscore')

28
আপনি কি একটু আরও তথ্য সরবরাহ করতে পারেন দয়া করে? এটি জাভাস্ক্রিপ্টের অংশ বা নোডের অংশ? এটা কি ভাল প্যাটার্ন অনুসরণ করা উচিত? হিসাবে আমি এই করা উচিত বা আমি এক্সপ্রেস সেট ব্যবহার করা উচিত? ধন্যবাদ
হ্যারি

4
আগের মন্তব্যটি ভুল। ব্রাউজারে, windowএটি বিশ্বব্যাপী অবজেক্ট। documentএকটি সম্পত্তি window
জি-উইজ

77
এটি অনুসরণ করা ভাল প্যাটার্ন নয়। এটি করবেন না। মডিউলগুলি ডিকুয়াল করতে 'প্রয়োজনীয়' ব্যবহারের কনভেনশনটি ভালভাবে চিন্তা করা যায়। কোন খারাপ কারণ ছাড়া আপনার এটি লঙ্ঘন করা উচিত নয়। নীচে আমার প্রতিক্রিয়া দেখুন।
ডেভ ডপসন

গ্লোবালগুলি সাধারণত এড়ানো যায়, তবে আপনি যদি সত্যিই সেগুলি ব্যবহার করতে চান। নীচের 3 টি বিবৃতি সমস্ত সমতুল্য এবং বিশ্বব্যাপী সুযোগে একটি রূপ বরাদ্দ করবে: GLOBAL._ = প্রয়োজনীয় ('আন্ডারস্কোর'); গ্লোবাল._ = প্রয়োজন ('আন্ডারস্কোর'); _ = প্রয়োজন ('আন্ডারস্কোর');
মেটাকালিন

আপনি যখন প্রকল্পটি কিছুটা বড় হতে শুরু করেন এটি বজায় রাখা দুঃস্বপ্ন হয়ে উঠবে। দয়া করে আমার পদ্ধতির দিকে একবার নজর দিন।
অলিভার ডিকসন

219

নোডে, আপনি "গ্লোবাল" বা "গ্লোবাল" অবজেক্টের মাধ্যমে গ্লোবাল ভেরিয়েবল সেট করতে পারেন:

GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)

বা আরও কার্যকরভাবে ...

GLOBAL.window = GLOBAL;  // like in the browser

নোড উত্স থেকে, আপনি দেখতে পাচ্ছেন যে এগুলি একে অপরের সাথে পরস্পরযুক্ত:

node-v0.6.6/src/node.js:
28:     global = this;
128:    global.GLOBAL = global;

উপরের কোডে, "এটি" হ'ল বৈশ্বিক প্রসঙ্গ। সাধারণ জেএস মডিউল সিস্টেমের সাথে (যা নোড ব্যবহার করে) মডিউলের অভ্যন্তরে "এই" অবজেক্টটি (যেমন, "আপনার কোড") বিশ্বব্যাপী প্রসঙ্গ নয়। এর প্রমাণের জন্য, নীচে দেখুন যেখানে আমি "এই" অবজেক্টটি এবং তারপরে দৈত্য "গ্লোবাল" অবজেক্টটি বানান।

console.log("\nTHIS:");
console.log(this);
console.log("\nGLOBAL:");
console.log(global);

/* outputs ...

THIS:
{}

GLOBAL:
{ ArrayBuffer: [Function: ArrayBuffer],
  Int8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Uint8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Int16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Uint16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Int32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Uint32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float64Array: { [Function] BYTES_PER_ELEMENT: 8 },
  DataView: [Function: DataView],
  global: [Circular],
  process: 
   { EventEmitter: [Function: EventEmitter],
     title: 'node',
     assert: [Function],
     version: 'v0.6.5',
     _tickCallback: [Function],
     moduleLoadList: 
      [ 'Binding evals',
        'Binding natives',
        'NativeModule events',
        'NativeModule buffer',
        'Binding buffer',
        'NativeModule assert',
        'NativeModule util',
        'NativeModule path',
        'NativeModule module',
        'NativeModule fs',
        'Binding fs',
        'Binding constants',
        'NativeModule stream',
        'NativeModule console',
        'Binding tty_wrap',
        'NativeModule tty',
        'NativeModule net',
        'NativeModule timers',
        'Binding timer_wrap',
        'NativeModule _linklist' ],
     versions: 
      { node: '0.6.5',
        v8: '3.6.6.11',
        ares: '1.7.5-DEV',
        uv: '0.6',
        openssl: '0.9.8n' },
     nextTick: [Function],
     stdout: [Getter],
     arch: 'x64',
     stderr: [Getter],
     platform: 'darwin',
     argv: [ 'node', '/workspace/zd/zgap/darwin-js/index.js' ],
     stdin: [Getter],
     env: 
      { TERM_PROGRAM: 'iTerm.app',
        'COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET': '/tmp/launch-nNl1vo/ServiceProcessSocket',
        TERM: 'xterm',
        SHELL: '/bin/bash',
        TMPDIR: '/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/',
        Apple_PubSub_Socket_Render: '/tmp/launch-9Ga0PT/Render',
        USER: 'ddopson',
        COMMAND_MODE: 'unix2003',
        SSH_AUTH_SOCK: '/tmp/launch-sD905b/Listeners',
        __CF_USER_TEXT_ENCODING: '0x12D732E7:0:0',
        PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin',
        PWD: '/workspace/zd/zgap/darwin-js',
        LANG: 'en_US.UTF-8',
        ITERM_PROFILE: 'Default',
        SHLVL: '1',
        COLORFGBG: '7;0',
        HOME: '/Users/ddopson',
        ITERM_SESSION_ID: 'w0t0p0',
        LOGNAME: 'ddopson',
        DISPLAY: '/tmp/launch-l9RQXI/org.x:0',
        OLDPWD: '/workspace/zd/zgap/darwin-js/external',
        _: './index.js' },
     openStdin: [Function],
     exit: [Function],
     pid: 10321,
     features: 
      { debug: false,
        uv: true,
        ipv6: true,
        tls_npn: false,
        tls_sni: true,
        tls: true },
     kill: [Function],
     execPath: '/usr/local/bin/node',
     addListener: [Function],
     _needTickCallback: [Function],
     on: [Function],
     removeListener: [Function],
     reallyExit: [Function],
     chdir: [Function],
     debug: [Function],
     error: [Function],
     cwd: [Function],
     watchFile: [Function],
     umask: [Function],
     getuid: [Function],
     unwatchFile: [Function],
     mixin: [Function],
     setuid: [Function],
     setgid: [Function],
     createChildProcess: [Function],
     getgid: [Function],
     inherits: [Function],
     _kill: [Function],
     _byteLength: [Function],
     mainModule: 
      { id: '.',
        exports: {},
        parent: null,
        filename: '/workspace/zd/zgap/darwin-js/index.js',
        loaded: false,
        exited: false,
        children: [],
        paths: [Object] },
     _debugProcess: [Function],
     dlopen: [Function],
     uptime: [Function],
     memoryUsage: [Function],
     uvCounters: [Function],
     binding: [Function] },
  GLOBAL: [Circular],
  root: [Circular],
  Buffer: 
   { [Function: Buffer]
     poolSize: 8192,
     isBuffer: [Function: isBuffer],
     byteLength: [Function],
     _charsWritten: 8 },
  setTimeout: [Function],
  setInterval: [Function],
  clearTimeout: [Function],
  clearInterval: [Function],
  console: [Getter],
  window: [Circular],
  navigator: {} }
*/

** দ্রষ্টব্য: "GLOBAL._" সেট করার বিষয়ে, সাধারণভাবে আপনার করা উচিত var _ = require('underscore');। হ্যাঁ, আপনি জাভাতে যেমন করেন তেমনই আন্ডারস্কোর ব্যবহার করে এমন প্রতিটি ফাইলই করেন import com.foo.bar;। এটি আপনার কোড কী করছে তা নির্ধারণ করা সহজ করে কারণ ফাইলগুলির মধ্যে লিঙ্কগুলি 'স্পষ্টত'। হালকা বিরক্তিকর, তবে একটি ভাল জিনিস। .... এটাই প্রচার।

প্রতিটি নিয়মের ব্যতিক্রম আছে। আমার "GLOBAL._" সেট করার দরকার ছিল সেখানে আমার ঠিক এক নজির ছিল। আমি "কনফিগারেশন" ফাইলগুলি সংজ্ঞায়নের জন্য একটি সিস্টেম তৈরি করছিলাম যা মূলত জেএসএন ছিল, তবে কিছুটা আরও নমনীয়তার অনুমতি দেওয়ার জন্য "জেএস-এ লিখিত" ছিল। এই জাতীয় কনফিগারেশন ফাইলগুলির কোনও 'প্রয়োজনীয়' বিবৃতি ছিল না, তবে আমি তাদের আন্ডারস্কোর (এনটিআরআইআর সিস্টেমটি আন্ডারস্কোর এবং আন্ডারস্কোর টেম্পলেটগুলির উপর পূর্বাভাস দেওয়া হয়েছিল) অ্যাক্সেস পেতে চেয়েছিলাম, সুতরাং "কনফিগারেশন" মূল্যায়নের আগে আমি "GLOBAL._" সেট করে দেব। হ্যাঁ, প্রতিটি নিয়মের জন্য কোথাও একটি ব্যতিক্রম আছে। তবে আপনার কাছে আরও ভাল কারণ থাকতে পারে এবং কেবল "আমি 'প্রয়োজন' টাইপ করে ক্লান্ত হয়ে পড়েছি তাই আমি কনভেনশনটি ভেঙে যেতে চাই"।


7
গ্লোবাল ব্যবহারের ক্ষয়ক্ষতিগুলি কী কী? আমার কেন একটি খারাপ কারণ প্রয়োজন? নীচের লাইনটি আমার অ্যাপটি ঠিক কাজ করে?
trusktr

26
শেষ পর্যন্ত, হ্যাঁ, আপনি যদি শিপ করেন তবে এটাই সমস্ত বিষয়। তবে নির্দিষ্ট কিছু অনুশীলনগুলি "সেরা অনুশীলন" হিসাবে পরিচিত এবং সেগুলি অনুসরণ করা সাধারণত আপনার শিপিংয়ের প্রতিক্রিয়া বা / বা আপনি যা তৈরি করেছেন তা বজায় রাখতে সক্ষম হন। "ভাল অনুশীলন" অনুসরণের গুরুত্ব প্রকল্পের আকারের সাথে বৃদ্ধি পায় এবং এটি দীর্ঘায়ু হয়। আমি স্বল্প-স্থায়ী প্রকল্পগুলিতে সমস্ত ধরণের বাজে হ্যাকগুলি তৈরি করেছি যা একবারে লেখার জন্য ছিল, কখনও পড়েনি (এবং "একক-বিকাশকারী") ছিল। একটি বড় প্রকল্পে, এই ধরণের কোণার কাটিয়াটি আপনার প্রকল্পের গতির জন্য ব্যয় করে।
ডেভ ডপসন

48
বিশেষত, গ্লোবাল সহ, সমস্যাটি পাঠযোগ্যতার একটি। যদি আপনার প্রোগ্রামটি স্বতঃস্ফূর্তভাবে বিশ্বব্যাপী ভেরিয়েবলগুলি ব্যবহার করে তবে এর অর্থ হ'ল কোডটি বোঝার জন্য আমাকে অবশ্যই পুরো অ্যাপ্লিকেশনটির গতিশীল রানটাইম স্থিতি বুঝতে হবে। এই কারণেই প্রোগ্রামাররা গ্লোবালের উদ্রেক করে। আমি নিশ্চিত যে এগুলিকে কার্যকরভাবে ব্যবহার করার কয়েক ডজন উপায় রয়েছে তবে আমরা বেশিরভাগই জুনিয়র প্রোগ্রামাররা তাদের খারাপ ব্যবহারের জন্য দুর্ব্যবহার করতে দেখেছি।
ডেভ ডপসন

2
কেন আপনি কনফিগার রফতানির আগে .jsআপনার নিয়মিত ফাইলগুলিতে একটি নিয়মিত ফাইল এবং কল করতে পারেন না require?
আজাত

4
@Jackie - en.wikipedia.org/wiki/Singleton_pattern । আপনি যদি সিঙ্গলটন প্যাটার্নে মানচিত্রগুলি করছেন তবে তা বোধগম্য হতে পারে। ডিবি সংযোগগুলি সিঙ্গেলনস হতে পারে যখন: 1) সেটআপ ব্যয়বহুল, 2) আপনি কেবল একবারে সংযোগটি একবার সেট আপ করতে চান, 3) সংযোগ বস্তু দীর্ঘকালীন এবং নেটওয়ার্ক হিচাপের ক্ষেত্রে ব্যর্থ অবস্থায় প্রবেশ করতে পারে না, 4) সংযোগ অবজেক্টটি থ্রেড-সেফ / অনেকগুলি কলার দ্বারা ভাগ করে নিতে সক্ষম।
ডেভ ডপসন

78

গ্লোবাল কীওয়ার্ড ব্যবহার করে এমন অন্যান্য সমাধান হ'ল প্রকল্পটি বড় হয়ে উঠলে / পঠনযোগ্যতা (+ নেমস্পেস দূষণ এবং বাগগুলি) বজায় রাখার জন্য একটি দুঃস্বপ্ন। আমি এই ভুলটি বহুবার দেখেছি এবং এটি সংশোধন করার ঝামেলা করেছি।

একটি জেএস ফাইল ব্যবহার করুন তারপরে মডিউল রফতানি ব্যবহার করুন।

উদাহরণ:

globals.js

var Globals = {
    'domain':'www.MrGlobal.com';
}

module.exports = Globals;

তারপরে আপনি যদি এগুলি ব্যবহার করতে চান তবে প্রয়োজনীয় ব্যবহার করুন।

var globals = require('globals'); //<< globals.js path
globals.domain //<< Domain.

12
আমি অবশ্যই ইউনিকর্নসকে পছন্দ করি না তবে আপনার পদ্ধতির মতো। ধন্যবাদ।
জোনাটাস ওয়াকার

globals.domainতবে বদলে যাব?
ফিজিক্স

1
@ iLoveUnicorn জবাব দেওয়ার জন্য ধন্যবাদ। আমি 'এক্সপ্রেস-সেশন' এর মতো বিকল্পগুলি সন্ধান করব যেহেতু লগ ইন করা ব্যবহারকারী ডেটা সংরক্ষণ করার জন্য আমার মূলত এটির প্রয়োজন।
ফিজিক্স

11
যদিও এটি আমার মতে এটি আরও ভাল পদ্ধতির, এটি গ্লোবাল তৈরি করে না এবং জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না। এটি একটি বিকল্প পদ্ধতির এবং আমি সর্বদা তাদের উত্সাহিত করব, তবে "এই এই থ্রেডের মধ্যে এটিই সঠিক সঠিক উত্তর" এর মতো বিবৃতিগুলির নিখুঁত বোকা-নীড় এখানে কেবল অন্তর্ভুক্ত নয়। stackoverflow.com/help/be-nice
Thor84no

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

12

বিশ্বব্যাপী নেমস্পেসের মতো কী global.MYAPI = {}

global.MYAPI._ = require('underscore')

কামিলো-মার্টিনের মন্তব্যের পরে সম্পাদনা করুন : অন্য সমস্ত পোস্টার জড়িত খারাপ প্যাটার্ন সম্পর্কে কথা বলে। সুতরাং সেই আলোচনাটিকে একপাশে রেখে বিশ্বব্যাপী একটি পরিবর্তনশীল সংজ্ঞায়িত করার সর্বোত্তম উপায় (ওপির প্রশ্ন) নাম স্থানের মাধ্যমে।

@ টিপ: http://thanpol.as/ জাভাস্ক্রিপ্ট / ডেভেলপমেন্ট- ব্যবহার- নাম স্পেস


3
এটাই কি require! নেমস্পেসগুলি ব্যবহার করা ঠিক আছে তবে global.foo = global.foo || {}সমস্ত ফাইলে বা কোনও কিছুতে যাবেন না । নামের স্থানটি সংজ্ঞায়িত করে এমন ফাইলের প্রয়োজন। শিশুদের জন্য এটি কি।
ক্যামিলো মার্টিন

@ ক্যামিলো-মার্টিন হাই, ১) গ্লোবাল সংজ্ঞা দিয়ে M 2) এটি কিছুই বাচ্চাদের সাথে থাকতে হবে না। এমনকি যদি সমস্ত এটি খারাপ প্যাটার্ন বলে, এটি প্রোগ্রামার এবং প্রদত্ত পরিস্থিতির উপর নির্ভর করে যে তিনি ভাষার এই সামর্থ্যটি কীভাবে ব্যবহার করেন।
ইগোর পররা

2
হ্যাঁ, তবে ধরা যাক আপনি একটি পৃথক ফাইলে একটি নেমস্পেসের কার্যকারিতা ঘোষণা করে। তারপরে আপনাকে অবজেক্টটি ব্যবহার করার জন্য একটি ফাইলের প্রয়োজন হবে যা পিছনের দিকে এবং কমনজেএস এবং কমনসেন্স এর বিরুদ্ধেও যায়। আপনি যদি স্টাফের প্রয়োজন হয় তবে ব্যবহারকারীর কোডের নামস্থান প্রয়োজন এবং নাম স্থানের প্রয়োজন নেই। দ্রষ্টব্য আমি নেমস্পেসের বিরুদ্ধে কিছু বলছি না , কেবল কারণগুলির জন্য কে ডেকেছে সে সম্পর্কে কনভেনশন রয়েছে। এবং ক্লায়েন্ট-পাশ আপনি নোড আছে কি না; আপনি যে লিঙ্কটি উল্লেখ করেছেন সেটি দেখুন একটি নির্দিষ্ট উপায়ে জিনিসগুলি করা হচ্ছে (বিশ্বব্যাপী) কারণ এটি ব্রাউজার সম্পর্কে এবং নোড নয়।
ক্যামিলো মার্টিন

1
দুঃখের বিষয় আপনি পোস্ট করা ইউআরএল কেবল তখনই কাজ করে যদি আপনি পেছনের
স্ল্যাশটি

10

আপনি কেবল বিশ্বব্যাপী অবজেক্টটি ব্যবহার করতে পারেন।

var X = ['a', 'b', 'c'];
global.x = X;

console.log(x);
//['a', 'b', 'c']

5

আমি একমত যে বিশ্বব্যাপী / বিশ্বব্যাপী নেমস্পেসকে বৈশ্বিক যে কোনও কিছু নির্ধারণের জন্য ব্যবহার করা খারাপ অভ্যাস এবং তাত্ত্বিকভাবে এটিকে ব্যবহার করবেন না ( তত্ত্বগতভাবে অপারেটিভ শব্দ হিসাবে) being তবে (হ্যাঁ, অপারেটিভ) আমি কাস্টম ত্রুটি শ্রেণি সেট করার জন্য এটি ব্যবহার করি:

// Some global/config file that gets called in initialisation

global.MyError = [Function of MyError];

হ্যাঁ, এখানে নিষিদ্ধ, তবে যদি আপনার সাইট / প্রকল্পটি পুরো জায়গা জুড়ে কাস্টম ত্রুটি ব্যবহার করে তবে আপনাকে মূলত এটি সর্বত্র সংজ্ঞায়িত করতে হবে বা কমপক্ষে কোথাও:

  1. প্রথম স্থানে ত্রুটি শ্রেণির সংজ্ঞা দিন
  2. যে স্ক্রিপ্টটিতে আপনি এটি ফেলে দিচ্ছেন
  3. যে স্ক্রিপ্টটিতে আপনি এটি ধরছেন In

বিশ্বব্যাপী নেমস্পেসে আমার কাস্টম ত্রুটিগুলি সংজ্ঞায়িত করা আমার গ্রাহকের ত্রুটি লাইব্রেরির প্রয়োজনের ঝামেলা বাঁচায়। ইমেজিং একটি কাস্টম ত্রুটি ছুঁড়ে ফেলেছে যেখানে সেই কাস্টম ত্রুটিটি সংজ্ঞায়িত।

এছাড়াও, যদি এটি ভুল হয় তবে দয়া করে আমাকে জানান যেহেতু আমি সম্প্রতি সম্প্রতি এটি করা শুরু করেছি

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