tutorial node how javascript node.js express

javascript - how - variables globales node.js?



node js install express windows (7)

Pregunté aquí: node.js requiere herencia?

y me dijeron que puedo establecer variables para el alcance global dejando de lado la var.

Esto no funciona para mi.

es decir:

_ = require(''underscore'');

No pone el _ disponible en los archivos requeridos. Puedo configurar con app.set de app.set y tenerlo disponible en otro lado.

¿Alguien puede confirmar que se supone que esto funciona? Gracias.


¿Qué tal un espacio de nombre global como global.MYAPI = {}

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

Editar después del comentario de camilo-martin : Todos los demás carteles hablan sobre el mal patrón involucrado. Entonces, dejando de lado esa discusión, la mejor manera de tener una variable definida globalmente (la pregunta de OP) es a través de los espacios de nombres.

@tip: http://thanpol.as/javascript/development-using-namespaces/


En el nodo, puede establecer variables globales a través del objeto "global" o "GLOBAL":

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

o más útilmente ...

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

Desde el origen del nodo, puede ver que estos son alias el uno al otro:

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

En el código anterior, "este" es el contexto global. Con el sistema de módulo commonJS (que usa el nodo), el objeto "este" dentro de un módulo (es decir, "su código") NO es el contexto global. Para la prueba de esto, mira a continuación donde escupo el objeto "este" y luego el objeto gigante "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: {} } */

** Nota: con respecto a la configuración "GLOBAL._", en general debe hacer var _ = require(''underscore''); . Sí, haces eso en cada archivo que usa subrayado, al igual que en Java import com.foo.bar; . Esto hace que sea más fácil averiguar qué está haciendo su código porque los enlaces entre los archivos son ''explícitos''. Algo molesto, pero algo bueno. .... Esa es la predicación.

Hay una excepción a cada regla. He tenido exactamente UNA instancia en la que necesitaba establecer "GLOBAL._". Estaba creando un sistema para definir archivos "config" que básicamente eran JSON, pero que estaban "escritos en JS" para permitir un poco más de flexibilidad. Dichos archivos de configuración no tenían sentencias ''require'', pero quería que tuvieran acceso al guión bajo (el sistema ENTERO se basaba en guiones bajos y guiones bajos), por lo que antes de evaluar la "configuración", establecería "GLOBAL._". Así que sí, para cada regla, hay una excepción en alguna parte. Pero será mejor que tengas una buena razón y no solo "me canso de tipear ''requerir'', así que quiero romper con la convención".


Estoy de acuerdo en que usar el espacio de nombres global / GLOBAL para establecer cualquier cosa global es una mala práctica y no la utilizo en absoluto en teoría ( en teoría, es la palabra operativa). Sin embargo (sí, el operativo) lo uso para configurar clases de error personalizadas:

// Some global/config file that gets called in initialisation global.MyError = [Function of MyError];

Sí, tabú aquí, pero si su sitio / proyecto usa errores personalizados en todo el lugar, básicamente debería definirlo en todas partes, o al menos en algún lugar para:

  1. Definir la clase de error en primer lugar
  2. En el script donde lo estás lanzando
  3. En el script donde lo estás atrapando

La definición de mis errores personalizados en el espacio de nombres global me ahorra la molestia de requerir la biblioteca de errores de mi cliente. Imaging lanzando un error personalizado donde ese error personalizado no está definido.

También, si esto está mal, por favor avíseme, ya que acabo de comenzar a hacer esto recientemente


Las otras soluciones que usan la palabra clave GLOBAL son una pesadilla para mantener / legibilidad (+ contaminación del espacio de nombres y errores) cuando el proyecto se agranda. He visto este error muchas veces y tuve la molestia de arreglarlo.

Use un archivo JS y luego use exportaciones de módulos.

Ejemplo:

globals.js

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

Luego, si desea usar estos, use require.

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


Puedes simplemente usar el objeto global.

var X = [''a'', ''b'', ''c'']; global.x = X; console.log(x); //[''a'', ''b'', ''c'']


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


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

Tenga en cuenta que el uso de GLOBAL está en desuso:

(node:59502) DeprecationWarning: ''GLOBAL'' is deprecated, use ''global''

Mi comentario:

Si sabes lo que estás haciendo, creo que está bien usar global. Cuando tengo que requerir alguna biblioteca cada vez que quiero usarla (y digamos que la estoy usando en decenas o cientos de archivos), creo que destruye el punto principal de muchas bibliotecas que están hechas para ser fáciles. y rápido de usar ¿Por qué se llama _ , no amazingLibraryCalledUnderscore ?

Entonces para mí, necesitar escribir 30 caracteres de var _ = require(''underscore''); es 3000% más que el mínimo requerido (1 char). Sí. Estoy obsesionado con hacer mi vida más fácil al escribir el código. Odio repetir cosas obvias. Si una vez le dije al maldito nodo lo que quiero decir con I want you to know _ means I use underscore que no quiero volver a decir.

Entonces, creo que cuando controlas tu código, debes tratar de hacerlo sexy . ¡Creo que escribir 30 caracteres cada vez para hacer tan simple cosa es malditamente feo!

PD. para confiar en ti mismo cuando dices I control my code , debes tener experiencia de perder este control al menos una vez.