source

Node.js 글로벌 변수

lovecheck 2022. 10. 19. 21:13
반응형

Node.js 글로벌 변수

질문: Node.js는 상속이 필요합니까?

그리고 변수를 생략하면 글로벌 스코프에 변수를 설정할 수 있다고 들었습니다.

이건 나한테 맞지 않아.

즉, 다음과 같은 경우,_필수 파일에서 사용할 수 있습니다.

_ = require('underscore');

Express.js로 설정할 수 있습니다.app.set다른 곳에서도 사용할 수 있습니다.

원래 이렇게 하는 거야?

다음과 같이 사용할 수 있습니다.

global._ = require('underscore')

Node.js에서는 "global" 또는 "GLOBAL" 개체를 통해 글로벌 변수를 설정할 수 있습니다.

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

더 유용하게...

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

Node.js 소스로부터, 이것들은 서로 에일리어스 되어 있는 것을 알 수 있습니다.

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

위의 코드에서 "this"는 글로벌 컨텍스트입니다.공통으로JS 모듈 시스템(Node.js가 사용하는 것), 모듈 내부의 "이" 객체(즉, "당신의 코드")는 글로벌 컨텍스트가 아닙니다.이에 대한 증거는 아래에서 "this" 오브젝트와 거대한 "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');네, Java에서처럼 Underscore.js를 사용하는 모든 파일에서 이 작업을 수행합니다.import com.foo.bar;파일 간의 연결은 '명시적'이므로 코드가 무엇을 하고 있는지 쉽게 파악할 수 있습니다.좀 귀찮지만 다행이다.그게 설교야.

모든 규칙에는 예외가 있다."GLOBAL"을 설정해야 하는 경우가 딱 한 번 있었습니다._." 기본적으로 JSON이지만 좀 더 유연하게 하기 위해 JavaScript로 작성된 "구성" 파일을 정의하는 시스템을 만들고 있었습니다.이러한 구성 파일에는 '필수' 문장이 없지만 Underscore.js(시스템 전체가 Underscore.js 및 Underscore.js 템플릿에 기반)에 액세스할 수 있도록 하고 싶었기 때문에 "구성"을 평가하기 전에 "GLOBAL"을 설정합니다."그래, 모든 규칙에는 예외가 있어.하지만 "필수 입력에 싫증이 나서 인습과 단절하고 싶다"는 것 말고 좋은 이유가 있어야 한다.

GLOBAL 키워드를 사용하는 다른 솔루션은 프로젝트가 커졌을 때 유지/가독성(+네임스페이스 오염 및 버그)을 유지하는 악몽입니다.나는 이런 실수를 여러 번 보았고 그것을 수정하는 데 애를 먹었다.

JavaScript 파일을 사용하여 모듈내보내기를 사용합니다.

예:

globals.js 파일

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

module.exports = Globals;

그런 다음 require를 사용하십시오.

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

를 사용합니다.global.MYAPI = {}:

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

다른 모든 포스터들은 관련된 나쁜 패턴에 대해 이야기한다.따라서 이러한 설명은 차치하고 변수를 글로벌하게 정의하는 가장 좋은 방법(OP의 질문)은 네임스페이스를 사용하는 것입니다.

힌트: 네임스페이스를 사용한 개발

글로벌 오브젝트를 사용하면 됩니다.

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

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

글로벌/글로벌 네임스페이스를 글로벌하게 설정하기 위해 사용하는 것은 나쁜 관행이며 이론상으로는 전혀 사용하지 않는다는 것에 동의합니다(이론적으로는 유효한 단어입니다).단, (요원) 커스텀에러 클래스 설정에 사용합니다.

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

global.MyError = [Function of MyError];

네, 여기서는 금기사항이지만 사이트/프로젝트 전체에서 커스텀 에러가 사용되고 있는 경우는 기본적으로 모든 장소에서, 또는 적어도 다음 목적을 위해 정의할 필요가 있습니다.

  1. 애초에 에러 클래스를 정의합니다.
  2. 네가 던지는 대본에서
  3. 그걸 잡고 있는 대본에서

글로벌 네임스페이스에서 커스텀 오류를 정의하면 고객 오류 라이브러리를 필요로 하는 번거로움이 줄어듭니다.사용자 지정 오류가 정의되지 않은 위치에 사용자 지정 오류를 보내는 이미지입니다.

글로벌하게 스트링에 액세스하려는 경우dotenv:

설치 대상:

npm i dotenv

다음 이 보세요..env프로젝트의 루트 디렉터리에 있는 모든 변수를 글로벌하게 설정할 수 있습니다.하다

DB_HOST='localhost'
DB_DATABASE='my_database'
DB_USER='my_user'
DB_PASSWORD='my_password'

ADMIN_EMAIL='foo@bar.baz'
CITY='Some city'
# ... etc

서버를 기동할 때는, 커맨드 라인 마다 다음의 변수를 설정할 수도 있습니다.

NODE_ENV=dev PORT=5000 npm run start-dev

git을 에는 git, git을 하는 것이 좋습니다..envyour .gitignore중요한 정보를 실수로 범하지 않도록 하기 위해서입니다.

이 글의 .server.js 최초로 file(파일)

require('dotenv').config()

에서 이러한 하려면 , 「」를 합니다.process.env.VARIABLE_NAME.

예를 들어 다음과 같습니다.

app.listen(process.env.PORT, () => {
    console.log(`Server is running on port ${process.env.PORT}.`)
})

주의: Underscore.js가 아닌 문자열을 글로벌하게 저장하는 것이기 때문에 질문에 직접 답변하지 않는 것은 이해하지만, 완전성을 위해 포함하려고 합니다.

언급URL : https://stackoverflow.com/questions/5447771/node-js-global-variables

반응형