Node.js objetos globales
En JavaScript hay un objeto especial llamado objeto global (Global Object). Tanto él como todas sus propiedades pueden ser accedidos desde cualquier lugar del programa, es decir, variables globales.
En JavaScript de navegador, normalmente window es el objeto global, mientras que en Node.js el objeto global es global; todas las variables globales (excepto global mismo) son propiedades del objeto global.
En Node.js podemos acceder directamente a las propiedades de global sin necesidad de incluirlo en la aplicación.
Objetos globales y variables globales
La función más fundamental de global es actuar como contenedor de las variables globales. Según la definición de ECMAScript, las variables que cumplen las siguientes condiciones son variables globales:
- Variables definidas en el ámbito más externo;
- Propiedades del objeto global;
- Variables definidas implícitamente (variables asignadas sin declararse).
Cuando defines una variable global, esta también se convierte en una propiedad del objeto global, y viceversa. Cabe señalar que en Node.js no es posible definir variables en el ámbito más externo, porque todo el código de usuario pertenece al módulo actual y el módulo en sí no es el contexto más externo.
Nota:Es mejor no usar var para definir variables, para evitar introducir variables globales, porque las variables globales contaminan el espacio de nombres y aumentan el riesgo de acoplamiento del código.
__filename
__filenameRepresenta el nombre del archivo del script que se está ejecutando actualmente. Produce la ruta absoluta de la ubicación del archivo, y puede no coincidir con el nombre de archivo especificado en los argumentos de la línea de comandos. Si está en un módulo, devuelve la ruta del archivo del módulo.
Ejemplo
Crea el archivo main.js, el código es el siguiente:
// 输出全局变量 __filename 的值 console.log( __filename );
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js /web/com/ejemplo/nodejs/main.js
__dirname
__dirnameRepresenta el directorio donde se encuentra el script que se está ejecutando actualmente.
Ejemplo
Crea el archivo main.js, el código es el siguiente:
// 输出全局变量 __dirname 的值 console.log( __dirname );
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js /web/com/ejemplo/nodejs
setTimeout(cb, ms)
setTimeout(cb, ms)La función global ejecuta la función especificada (cb) después del número especificado de milisegundos (ms). setTimeout() solo ejecuta la función especificada una vez.
Devuelve un valor de identificador que representa el temporizador.
Ejemplo
Crea el archivo main.js, el código es el siguiente:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setTimeout(printHello, 2000);
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js Hello, World!
clearTimeout(t)
clearTimeout( t )La función global se utiliza para detener un temporizador previamente creado mediante setTimeout(). El parámetrotes el temporizador creado por la función setTimeout().
Ejemplo
Crea el archivo main.js, el código es el siguiente:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
var t = setTimeout(printHello, 2000);
// 清除定时器
clearTimeout(t);
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js
setInterval(cb, ms)
setInterval(cb, ms)La función global ejecuta la función especificada (cb) después del número especificado de milisegundos (ms).
Devuelve un valor de identificador que representa el temporizador. Puede usarclearInterval(t)la función para borrar el temporizador.
El método setInterval() llama a la función continuamente hasta que se invoque clearInterval() o se cierre la ventana.
Ejemplo
Crea el archivo main.js, el código es el siguiente:
function printHello(){
console.log( "Hello, World!");
}
// 两秒后执行以上函数
setInterval(printHello, 2000);
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.jsHello, World! Hello, World! Hello, World! Hello, World! Hello, World! ……
El programa anterior imprime "Hello, World!" cada dos segundos y se ejecutará indefinidamente hasta que presionesctrl + cel botón.
console
console se utiliza para proporcionar la salida estándar de la consola. Fue una herramienta de depuración proporcionada por el motor JScript de Internet Explorer y gradualmente se convirtió en el estándar de implementación de los navegadores.
Node.js adoptó este estándar y proporciona un objeto console coherente con el comportamiento habitual, que se utiliza para generar caracteres hacia el flujo de salida estándar (stdout) o el flujo de error estándar (stderr).
Métodos de console
Los siguientes son los métodos del objeto console:
| N.º | Método y descripción |
|---|---|
| 1 | console.log([data][, ...]) Imprime caracteres en el flujo de salida estándar y termina con un salto de línea. Este método acepta varios parámetros; si solo hay un parámetro, genera la forma de cadena de ese parámetro. Si hay varios parámetros, los genera con un formato similar al comando printf() del lenguaje C. |
| 2 | console.info([data][, ...]) La función de este comando es devolver mensajes informativos. No se diferencia mucho de console.log, excepto que en Chrome solo muestra texto; en el resto, muestra un signo de exclamación azul. |
| 3 | console.error([data][, ...]) Se utiliza para enviar mensajes de error. Cuando aparece un error, la consola muestra una cruz roja. |
| 4 | console.warn([data][, ...]) Envía mensajes de advertencia. La consola muestra un signo de exclamación amarillo. |
| 5 | console.dir(obj[, options]) Se utiliza para inspeccionar un objeto y mostrarlo en un formato fácil de leer e imprimir. |
| 6 | console.time(label) Muestra el tiempo, indicando el inicio del cronometraje. |
| 7 | console.timeEnd(label) Finaliza el tiempo, indicando el fin del cronometraje. |
| 8 | console.trace(message[, ...]) La ruta de llamada del código que se está ejecutando en la pila. Esta función de prueba es muy útil; basta con añadir console.trace dentro de la función que se desea probar. |
| 9 | console.assert(value[, message][, ...]) Se utiliza para determinar si una expresión o variable es verdadera. Recibe dos parámetros: el primero es la expresión y el segundo es una cadena. Solo cuando el primer parámetro es false se emite el segundo parámetro; de lo contrario, no ocurre nada. |
console.log acepta varios parámetros; si solo hay un parámetro, genera la forma de cadena de ese parámetro. Si hay varios parámetros, los genera con un formato similar al comando printf() del lenguaje C.
El primer parámetro es una cadena; si no hay parámetros, solo imprime un salto de línea.
console.log('Hello world');
console.log('byvoid%diovyb');
console.log('byvoid%diovyb', 1991);
El resultado de la ejecución es:
Hello world byvoid%diovyb byvoid1991iovyb
- console.error(): tiene el mismo uso que console.log(), solo que emite al flujo de error estándar.
- console.trace(): emite la pila de llamadas actual al flujo de error estándar.
console.trace();
El resultado de la ejecución es:
Trace: at Object.<anonymous> (/home/byvoid/consoletrace.js:1:71) at Module._compile (module.js:441:26) at Object..js (module.js:459:10) at Module.load (module.js:348:31) at Function._load (module.js:308:12) at Array.0 (module.js:479:10) at EventEmitter._tickCallback (node.js:192:40)
Ejemplo
Crea el archivo main.js, el código es el siguiente:
console.info("程序开始执行:");
var counter = 10;
console.log("计数: %d", counter);
console.time("获取数据");
//
// 执行一些代码
//
console.timeEnd('获取数据');
console.info("程序执行完毕。")
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js 程序开始执行: 计数: 10 获取数据: 0ms 程序执行完毕
process
process es una variable global, es decir, una propiedad del objeto global.
Es un objeto que describe el estado del proceso actual de Node.js y proporciona una interfaz simple con el sistema operativo. Normalmente, al escribir programas locales de línea de comandos, es indispensable tratar con él. A continuación se presentarán algunos de los métodos miembro más utilizados del objeto process.
| N.º | Evento y descripción |
|---|---|
| 1 | exit Se activa cuando el proceso está a punto de salir. |
| 2 | beforeExit Este evento se activa cuando node vacía el bucle de eventos y no hay otras tareas programadas. Normalmente, node sale cuando no hay tareas pendientes, pero los listeners de 'beforeExit' pueden realizar llamadas asíncronas, lo que hace que node continúe ejecutándose. |
| 3 | uncaughtException Cuando una excepción asciende de vuelta al bucle de eventos, se activa este evento. Si se añade un monitor a la excepción, la operación predeterminada (imprimir la información de seguimiento de la pila y salir) no ocurrirá. |
| 4 | Evento Signal Se activa cuando el proceso recibe una señal. Para la lista de señales, consulte los nombres estándar de señales POSIX, como SIGINT, SIGUSR1, etc. |
Ejemplo
Crea el archivo main.js, el código es el siguiente:
process.on('exit', function(code) {
// 以下代码永远不会执行
setTimeout(function() {
console.log("该代码不会执行");
}, 0);
console.log('退出码为:', code);
});
console.log("程序执行结束");
Ejecuta el archivo main.js, el código es el siguiente:
$ node main.js 程序执行结束 退出码为: 0
Códigos de estado de salida
| Código de estado | Nombre y descripción |
|---|---|
| 1 | Uncaught Fatal Exception Hay una excepción no capturada que no fue manejada por un dominio ni por el manejador uncaughtException. |
| 2 | Unused Reservado, Bash lo reserva para mal uso interno. |
| 3 | Internal JavaScript Parse Error Error de análisis causado por el código fuente de JavaScript al iniciar el proceso de Node. Es muy raro y solo ocurre durante el desarrollo de Node. |
| 4 | Internal JavaScript Evaluation Failure Al iniciar el proceso de Node con código fuente de JavaScript, falla la evaluación al devolver la función. Es muy raro y solo ocurre durante el desarrollo de Node. |
| 5 | Fatal Error Error fatal e irrecuperable en V8. Normalmente se imprime en stderr con el contenido: FATAL ERROR |
| 6 | Non-function Internal Exception Handler Excepción no capturada; el manejador de excepciones interno está configurado como no función por alguna razón y no puede ser invocado. |
| 7 | Internal Exception Handler Run-Time Failure Excepción no capturada, y el manejador de excepciones lanzó una excepción al manejarla. Por ejemplo, si process.on('uncaughtException') o domain.on('error') lanzan una excepción. |
| 8 | Unused Reservado. En versiones anteriores de Node.js, el código de salida 8 a veces indicaba una excepción no capturada. |
| 9 | Invalid Argument Puede ser que se haya pasado un argumento desconocido, o que el argumento dado no tenga valor. |
| 10 | Internal JavaScript Run-Time Failure Error lanzado al iniciar el proceso de Node desde el código fuente de JavaScript. Es muy raro, y solo ocurre durante el desarrollo de Node. |
| 12 | Invalid Debug Argument Se establecieron los parámetros --debug y/o --debug-brk, pero se eligió un puerto incorrecto. |
| 128 | Signal Exits Si Node recibe una señal fatal, como SIGKILL o SIGHUP, el código de salida es 128 más el código de la señal. Esta es una práctica estándar de Unix; el código de la señal de salida se coloca en el byte alto. |
Propiedades de Process
Process proporciona muchas propiedades útiles para que podamos controlar mejor la interacción con el sistema:
| N.º | Propiedad y descripción |
|---|---|
| 1 | stdout Flujo de salida estándar. |
| 2 | stderr Flujo de error estándar. |
| 3 | stdin Flujo de entrada estándar. |
| 4 | argv La propiedad argv devuelve un array compuesto por los parámetros al ejecutar el script desde la línea de comandos. Su primer miembro es siempre node, el segundo es el nombre del archivo del script, y los demás son los parámetros del archivo de script. |
| 5 | execPath Devuelve la ruta absoluta del binario de Node que ejecuta el script actual. |
| 6 | execArgv Devuelve un array cuyos miembros son los argumentos de línea de comandos entre el ejecutable de Node y el archivo de script al ejecutar el script desde la línea de comandos. |
| 7 | env Devuelve un objeto cuyos miembros son las variables de entorno del shell actual. |
| 8 | exitCode El código de salida del proceso. Si el proceso sale mediante process.exit(), no es necesario especificar el código de salida. |
| 9 | version La versión de Node, por ejemplo v0.10.18. |
| 10 | versions Una propiedad que contiene la versión de Node y sus dependencias. |
| 11 | config Un objeto que contiene las opciones de configuración de JavaScript utilizadas para compilar el ejecutable actual de Node. Es el mismo que el archivo "config.gypi" generado al ejecutar el script ./configure. |
| 12 | pid El número de proceso (PID) del proceso actual. |
| 13 | title El nombre del proceso, cuyo valor predeterminado es "node". Este valor se puede personalizar. |
| 14 | arch La arquitectura de la CPU actual: 'arm', 'ia32' o 'x64'. |
| 15 | platform El sistema de plataforma donde se ejecuta el programa: 'darwin', 'freebsd', 'linux', 'sunos' o 'win32'. |
| 16 | mainModule Método alternativo a require.main. La diferencia es que si el módulo principal cambia en tiempo de ejecución, require.main puede seguir devolviendo el módulo anterior. Se puede considerar que ambos hacen referencia al mismo módulo. |
Ejemplo
Cree el archivo main.js, con el siguiente código:
// 输出到终端
process.stdout.write("Hello World!" + "\n");
// 通过参数读取
process.argv.forEach(function(val, index, array) {
console.log(index + ': ' + val);
});
// 获取执行路径
console.log(process.execPath);
// 平台信息
console.log(process.platform);
Ejecute el archivo main.js, con el siguiente código:
$ node main.js Hello World! 0: node 1: /web/www/node/main.js /usr/local/node/0.10.36/bin/node darwin
Manual de referencia de métodos
Process proporciona muchos métodos útiles para que podamos controlar mejor la interacción con el sistema:
| N.º | Método y descripción |
|---|---|
| 1 | abort() Esto hará que Node active el evento abort. Hará que Node salga y genere un archivo central (core). |
| 2 | chdir(directory) Cambia el directorio del proceso de trabajo actual. Si la operación falla, lanza una excepción. |
| 3 | cwd() Devuelve el directorio de trabajo del proceso actual. |
| 4 | exit([code]) Finaliza el proceso con el código (code) especificado. Si se omite, se utilizará el código 0. |
| 5 | getgid() Obtiene el identificador de grupo del proceso (consulte getgid(2)). Obtiene el id numérico del grupo, no el nombre. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 6 | setgid(id) Establece el identificador de grupo del proceso (consulte setgid(2)). Puede recibir un ID numérico o un nombre de grupo. Si se especifica un nombre de grupo, se bloqueará esperando que se resuelva a un ID numérico. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 7 | getuid() Obtiene el identificador de usuario del proceso (consulte getuid(2)). Es el id numérico del usuario, no el nombre de usuario. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 8 | setuid(id) Establece el identificador de usuario del proceso (consulte setuid(2)). Recibe un ID numérico o un nombre de cadena. Si se especifica un nombre de grupo, se bloqueará esperando que se resuelva a un ID numérico. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 9 | getgroups() Devuelve el array de IDs de grupo del proceso. Los sistemas POSIX no garantizan que exista, pero Node.js garantiza que sí. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 10 | setgroups(groups) Establece el ID de grupo del proceso. Esta es una operación autorizada, por lo que necesita tener privilegios de root o la capacidad CAP_SETGID. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 11 | initgroups(user, extra_group) Lee /etc/group e inicializa la lista de acceso a grupos, utilizando todos los grupos en los que es miembro. Esta es una operación autorizada, por lo que necesita tener privilegios de root o la capacidad CAP_SETGID. Nota: esta función solo está disponible en plataformas POSIX (por ejemplo, no en Windows ni Android). |
| 12 | kill(pid[, signal]) Envía una señal al proceso. pid es el id del proceso y signal es la descripción de la señal a enviar. El nombre de la señal es una cadena, como 'SIGINT' o 'SIGHUP'. Si se omite, la señal será 'SIGTERM'. |
| 13 | memoryUsage() Devuelve un objeto que describe el estado de la memoria utilizada por el proceso de Node, en bytes. |
| 14 | nextTick(callback) Llama a la función de devolución de llamada (callback) una vez que finaliza el bucle de eventos actual. |
| 15 | umask([mask]) Establece o lee la máscara de archivos del proceso. Los procesos secundarios heredan la máscara del proceso padre. Si el parámetro mask es válido, devuelve la máscara anterior. De lo contrario, devuelve la máscara actual. |
| 16 | uptime() Devuelve el número de segundos que Node ha estado ejecutándose. |
| 17 | hrtime() Devuelve el tiempo de alta resolución del proceso actual, en forma de un array [seconds, nanoseconds]. Es relativo a un evento arbitrario en el pasado. Este valor no está relacionado con la fecha, por lo que no se ve afectado por la deriva del reloj. Su propósito principal es medir el rendimiento del programa mediante intervalos de tiempo precisos. Puede pasar el resultado anterior a process.hrtime() actual, y devolverá la diferencia de tiempo entre ambos, para comparar (benchmark) y medir intervalos de tiempo. |
Ejemplo
Cree el archivo main.js, con el siguiente código:
// 输出当前目录
console.log('当前目录: ' + process.cwd());
// 输出当前版本
console.log('当前版本: ' + process.version);
// 输出内存使用情况
console.log(process.memoryUsage());
Ejecute el archivo main.js, con el siguiente código:
$ node main.js
当前目录: /web/com/ejemplo/nodejs
当前版本: v0.10.36
{ rss: 12541952, heapTotal: 4083456, heapUsed: 2157056 } Otras extensiones