Aquí está la tercera parte de la traducción del manual Node.js. Hoy hablaremos sobre elegir un alojamiento para proyectos Node.js, cómo trabajar con Node.js en modo REPL y cómo ejecutar scripts con argumentos, cómo interactuar con la consola y los módulos.

[Le aconsejamos que lea] Otras partes del cicloParte 1:
Información general y primeros pasosParte 2:
JavaScript, V8, algunos trucos de desarrolloParte 3:
Hosting, REPL, trabajar con la consola, módulosParte 4:
archivos npm, package.json y package-lock.jsonParte 5:
npm y npxParte 6:
bucle de eventos, pila de llamadas, temporizadoresParte 7:
Programación asincrónicaParte 8:
Guía de Node.js, Parte 8: Protocolos HTTP y WebSocketParte 9:
Guía de Node.js, parte 9: trabajar con el sistema de archivosParte 10:
Guía de Node.js, Parte 10: Módulos estándar, flujos, bases de datos, NODE_ENVPDF completo de la guía Node.js Hosting para aplicaciones Node.js
La elección del alojamiento para aplicaciones Node.js depende de sus necesidades. Aquí hay una breve lista de opciones de alojamiento que puede explorar al decidir implementar su aplicación y ponerla a disposición del público. Primero, considere opciones simples, cuyas capacidades son limitadas, y luego más complejas, pero también con capacidades más serias.
▍ La opción de alojamiento más fácil: túnel local
Incluso si se asigna una dirección IP dinámica a su computadora o si está detrás de NAT, puede implementar su aplicación en ella y atender las solicitudes de los usuarios mediante un túnel local.
Esta opción es adecuada para organizar rápidamente las pruebas, para organizar una demostración del producto o para dar acceso a la aplicación a un grupo muy pequeño de personas.
Hay un muy buen servicio para organizar túneles locales,
ngrok , disponible para muchas plataformas.
Usando ngrok, es suficiente ejecutar un comando de la forma
ngrok PORT
y el puerto que especificó será accesible desde Internet. Al mismo tiempo, si usa la versión gratuita del servicio, tendrá una dirección en el dominio
ngrok.io
. Si decide obtener una suscripción paga, puede usar sus propios nombres de dominio y, además, puede aumentar la seguridad de la solución (usando ngrok, abre el acceso a su computadora a través de Internet).
Otra herramienta que se puede utilizar para organizar túneles locales se llama
localtunnel .
▍ Entornos para implementar proyectos de Node.js que no requieren configuración
Falla
Glitch es un entorno interactivo y una plataforma para el desarrollo rápido de aplicaciones que le permite implementarlos en los subdominios de glitch.com. Esta plataforma aún no admite sus propios dominios de usuario, existen algunas
limitaciones al trabajar con ella, pero es excelente para trabajar en prototipos de aplicaciones. El diseño de Glitch se ve bastante divertido (tal vez esto se puede escribir en las ventajas de esta plataforma), pero este no es un tipo de entorno de "juguete" que es muy limitado. Aquí tiene la oportunidad de trabajar con Node.js, CDN, un repositorio seguro de información confidencial, la capacidad de intercambiar datos con GitHub y mucho más.
El proyecto Glitch está dirigido por la misma compañía detrás de FogBugz y Trello (uno de los creadores de StackOverflow). A menudo uso esta plataforma para demostrar aplicaciones.
Codepen
Codepen es una gran plataforma alrededor de la cual se ha formado una comunidad interesante. Aquí puede crear proyectos que incluyen muchos archivos e implementarlos utilizando su propio dominio.
▍ Entornos sin servidor
Las plataformas sin servidor le permiten publicar aplicaciones sin pensar completamente en los servidores, en configurarlos o en administrarlos. El paradigma de la informática sin servidor es que las aplicaciones se publican como funciones que responden a las llamadas a un punto final de la red. Un enfoque similar para la implementación de aplicaciones también se llama FAAS (Funciones como servicio, Función como servicio).
Aquí hay un par de soluciones populares en esta área:
Ambos proyectos proporcionan al desarrollador un cierto nivel de abstracción, que permite publicar aplicaciones en varias plataformas FAAS, por ejemplo, Amazon AWS Lambda, Microsoft Azure y Google Cloud.
▍ Soluciones PAAS
Las PAAS (Platform As A Service, Platform as a Service) son plataformas que se encargan de muchas cosas que, en circunstancias normales, deben ser atendidas por el desarrollador que implementa la aplicación.
Zeit Now
Zeit es una opción interesante para implementar aplicaciones. La implementación, utilizando esta plataforma, se reduce a ingresar el comando
now
en la terminal. Hay una versión gratuita de Zeit, hay algunas restricciones cuando se trabaja con él. También hay una versión paga y más potente de esta plataforma. Con Zeit, simplemente no puede pensar en el hecho de que su aplicación necesita un servidor. Simplemente despliega la aplicación, y todo lo demás es administrado por esta plataforma.
Nanobox
Los creadores de la plataforma
Nanobox , que incluye la implementación de aplicaciones Node.js, lo llaman PAAS V2.
Heroku
Heroku es otra gran plataforma para alojar aplicaciones Node.js.
Aquí hay un buen artículo sobre cómo trabajar con él.
Microsoft azure
Azure es una plataforma en la nube de Microsoft. Su documentación tiene una
sección sobre aplicaciones Node.js.
Google Cloud Platform
Google Cloud es un excelente entorno para implementar aplicaciones Node.js.
Aquí está la sección relevante de su documentación.
▍ Hosting VPS
Hay muchas plataformas que proporcionan
servicios de alojamiento VPS . Una característica común de tales plataformas es el hecho de que el desarrollador tiene a su disposición un servidor virtual, instala independientemente un sistema operativo (Linux o Windows) en él e implementa aplicaciones de forma independiente.
Entre las plataformas que proporcionan servicios VPS, de las cuales hay muchas, podemos observar lo siguiente, que utilicé y que podría recomendar a otros:
Por nuestra cuenta, agregamos que RUVDS también proporciona servicios de alojamiento VPS. Tenemos licencia de FSTEC, nuestros clientes están asegurados por AIG, tenemos cuatro centros de datos en diferentes países. Hay su propio centro de datos RUCLOUD nivel TIER 3 en la ciudad de Korolev, región de Moscú, así como zonas de presión en los centros de datos Deltalis (Suiza) , London Equinix LD8 (Gran Bretaña) y MMTS-9 (Moscú, Rusia). Todas las zonas de contención cumplen con un nivel de confiabilidad de al menos TIER 3.
Los socios de la compañía son FINAM JSC, el grupo financiero BCS, el Depósito Nacional de Liquidación (Intercambio de Moscú), VTsIOM JSC, la compañía Gars-Telecom, el operador de taxi Gett, el operador de entrega de Delivery Club y muchos otros.
▍ Servidor normal
Otra solución de alojamiento es comprar (o alquilar, por ejemplo, utilizando el servicio
Vultr Bare Metal ) un servidor normal, instalar Linux y otro software en él, conectarlo a Internet y alojar aplicaciones Node.js en él.
El alojamiento es un gran tema, pero, con suerte, los materiales de esta sección le permitirán elegir exactamente lo que necesita. Ahora pasamos a la historia sobre trabajar con Node.js en modo REPL.
Usando Node.js en modo REPL
La abreviatura REPL significa Read-Evaluate-Print-Loop (ciclo "leer - calcular - salida"). Usar REPL es una excelente manera de explorar rápidamente las capacidades de Node.js.
Como ya sabe, el comando de
node
se usa para ejecutar scripts en Node.js, se ve así:
node script.js
Si ingresa el mismo comando, pero no especifica un nombre de archivo, Node.js se iniciará en modo REPL:
node
Si intenta ingresar un comando de este tipo en su terminal, verá como resultado lo siguiente:
> node >
Node.js ahora está en modo de espera. El sistema espera que ingresemos un código JavaScript en la línea de comando que ejecutará.
Para comenzar, intentemos algo muy simple:
> console.log('test') test undefined >
Aquí sugerimos que Node.js ejecute el comando utilizado para enviar datos a la consola. El primer valor,
test
, es lo que
console.log('test')
. El segundo valor,
undefined
, es el que devolvió la función
console.log()
.
Una vez que se completa el comando, aparece el mensaje REPL, lo que significa que podemos ingresar un nuevo comando aquí.
▍Completar comandos con la tecla Tab
REPL es un entorno interactivo. Si presiona la tecla
Tab
en su teclado mientras escribe código, REPL intentará completar automáticamente la entrada seleccionando, por ejemplo, un nombre adecuado para la variable que ya ha declarado o el nombre de un objeto estándar.
▍Explorando objetos JavaScript
Ingrese el nombre de algún objeto JavaScript estándar en la línea de comando, por ejemplo,
Number
, agregue un punto después y presione
Tab
.
REPL enumerará las propiedades y métodos del objeto con los que el desarrollador puede interactuar:
Examinando el objeto numérico▍Explorar objetos globales
Para averiguar con qué objetos globales de Node.js puede trabajar, ingrese el comando
global.
en el terminal
global.
y presione
Tab
.
Investigación global de objetos▍ Variable especial _
La variable
_
(guión bajo) almacena el resultado de la última operación realizada. Esta variable se puede usar como parte de los comandos ingresados en la consola.
▍ Comandos que comienzan con un punto
En el modo REPL, puede usar algunos comandos especiales que comienzan con un punto. Aquí están:
- El comando
.help
muestra información de referencia para los comandos que comienzan con un punto. - El comando
.editor
sistema en modo editor, lo que facilita el ingreso de código JavaScript multilínea. Después de estar en este modo, ingresa todo lo que desea, para ejecutar el código, use el comando Ctrl+D
- El comando
.break
permite cancelar la entrada de expresión de varias líneas. Su uso es similar al uso del método abreviado de teclado Ctrl+C
- El comando
.clear
borra el contexto REPL y también interrumpe la entrada de una expresión de varias líneas. - El comando
.load
carga el código de un archivo JavaScript en la sesión actual. - El comando
.save
guarda todo lo que se ingresó durante la sesión REPL en el archivo. - El comando
.exit
permite salir de una sesión REPL; actúa como dos pulsaciones de tecla consecutivas de la combinación de teclas Ctrl+C
Cabe señalar que REPL reconoce la entrada de expresiones de varias líneas incluso sin usar el
.editor
.
Por ejemplo, comenzamos a ingresar un código iterador:
[1, 2, 3].forEach(num => {
Si, después de ingresar la llave, presione la tecla
Enter
, REPL irá a una nueva línea, cuyo mensaje se verá como tres puntos. Esto indica que podemos ingresar el código para el bloque correspondiente. Se ve así:
... console.log(num) ... })
Al presionar
Enter
después de ingresar el último paréntesis se ejecutará la expresión. Si ingresa
.break
en este modo, la entrada se cancelará y la expresión no se ejecutará.
El modo REPL es una característica útil de Node.js, pero su alcance se limita a pequeños experimentos. Estamos interesados en algo más que la capacidad de ejecutar un par de comandos. Por lo tanto, pasamos a trabajar con Node.js en modo normal. A saber, hablemos sobre cómo los scripts Node.js pueden tomar argumentos de línea de comando.
Trabajar con argumentos de línea de comandos en scripts Node.js
Al ejecutar scripts Node.js, se les pueden pasar argumentos. Aquí hay una llamada de script regular:
node app.js
Los argumentos pasados al script pueden ser valores independientes o construcciones clave-valor. En el primer caso, ejecutar el script se ve así:
node app.js flavio
En el segundo, así:
node app.js name=flavio
El método de pasar argumentos se usa para determinar cómo puede trabajar con ellos en el código del script.
Entonces, para acceder a los argumentos de la línea de comando, se usa el objeto de
process
estándar Node.js. Tiene la propiedad
argv
, que es una matriz que contiene, entre otras cosas, los argumentos pasados al script al inicio.
El primer elemento de la matriz
argv
contiene la ruta completa al archivo que se ejecuta cuando se ingresa el comando de
node
en la línea de comando.
El segundo elemento es la ruta al ejecutable del script.
Todos los demás elementos de la matriz, comenzando desde el tercero, contienen lo que se pasó al script cuando se ejecutó.
La enumeración de argumentos disponibles en
argv
(esto incluye tanto la ruta al
node
como la ruta al archivo ejecutable del script) se puede organizar utilizando el bucle
forEach
:
process.argv.forEach((val, index) => { console.log(`${index}: ${val}`) })
Si no está interesado en los dos primeros argumentos, basándose en
argv
puede crear una nueva matriz que incluirá todo, desde
argv
excepto los dos primeros elementos:
const args = process.argv.slice(2)
Supongamos que, al ejecutar un script, solo se le pasa un argumento, en forma de un valor independiente:
node app.js flavio
Puede acceder a este argumento así:
const args = process.argv.slice(2) args[0]
Ahora intentemos usar una construcción de tipo clave-valor:
node app.js name=flavio
Con este enfoque, después de que se forma la matriz
args
, la cadena
name=flavio
en
args[0]
. Antes de usar el argumento, esta cadena debe analizarse. La forma más conveniente de hacer esto es usar la biblioteca
minimista , que está diseñada para facilitar el trabajo con argumentos de línea de comandos:
const args = require('minimist')(process.argv.slice(2)) args['name']
Ahora considere la salida a la consola.
Salida de datos a la consola usando el módulo de consola
El módulo de
consola estándar de Node.js brinda al desarrollador muchas oportunidades para interactuar con la línea de comandos durante la ejecución del programa. En general, esto es lo mismo que el objeto de
console
utilizado en JavaScript basado en navegador. Quizás el método más simple y más utilizado del módulo de
console.log()
es
console.log()
, que se utiliza para enviar datos de cadena a la consola. Además, si le pasa un objeto, entonces, antes de la salida, se convertirá en su representación de cadena.
El método
console.log()
puede pasar varios valores:
const x = 'x' const y = 'y' console.log(x, y)
Después de ejecutar esta secuencia de instrucciones, tanto el valor
x
como el valor
y
llegarán a la consola.
Para formar cadenas complejas, el comando
console.log()
admite el uso de comodines, que, al generar datos, se reemplazan con sus valores correspondientes en orden de prioridad.
Por ejemplo, aquí hay un comando que muestra el texto
My cat has 2 years
:
console.log('My %s has %d years', 'cat', 2)
Considere las características de los comodines:
%s
formatea el valor como una cadena.%d
%i
formatea el valor como un entero.%f
formatea el valor como un número de punto flotante.%O
utiliza para mostrar representaciones en cadena de objetos.
Aquí hay otro ejemplo de uso de comodines:
console.log('%O', Number)
▍Limpieza de la consola
Para borrar la consola, use el comando
console.clear()
(su comportamiento en diferentes terminales puede variar).
▍ Elementos de conteo
Ahora veremos el útil método
console.count()
. Echa un vistazo a este código:
const x = 1 const y = 2 const z = 3 console.count( 'The value of x is ' + x + ' and has been checked .. how many times?' ) console.count( 'The value of x is ' + x + ' and has been checked .. how many times?' ) console.count( 'The value of y is ' + y + ' and has been checked .. how many times?' )
El método
count()
cuenta el número de salidas de fila y muestra el resultado junto a ellas.
Con este método, en el siguiente ejemplo, puede contar manzanas y naranjas:
const oranges = ['orange', 'orange'] const apples = ['just one apple'] oranges.forEach(fruit => { console.count(fruit) }) apples.forEach(fruit => { console.count(fruit) })
▍Muestra de resultados de seguimiento de pila a la consola
A veces es útil imprimir un rastro de la pila de funciones en la consola. Por ejemplo, para responder a la pregunta de cómo llegamos a cierto lugar en el programa. Puede hacer esto con el siguiente comando:
console.trace()
Aquí hay un ejemplo de su uso:
const function2 = () => console.trace() const function1 = () => function2() function1()
Esto es lo que sucedió cuando ejecuté este código en modo REPL:
Trace at function2 (repl:1:33) at function1 (repl:1:25) at repl:1:1 at ContextifyScript.Script.runInThisContext (vm.js:44:33) at REPLServer.defaultEval (repl.js:239:29) at bound (domain.js:301:14) at REPLServer.runBound [as eval] (domain.js:314:12) at REPLServer.onLine (repl.js:440:10) at emitOne (events.js:120:20) at REPLServer.emit (events.js:210:7)
▍Medir el tiempo necesario para completar una acción
Puede medir el tiempo que lleva, por ejemplo, ejecutar una función, utilizando los métodos
console.time()
y
console.timeEnd()
. Se ve así:
const doSomething = () => console.log('test') const measureDoingSomething = () => { console.time('doSomething()') // , doSomething() console.timeEnd('doSomething()') } measureDoingSomething()
▍Trabajar con stdout y stderr
Como hemos visto, el comando
console.log()
es excelente para enviar mensajes a la consola. Cuando se usa, se usa el llamado flujo de salida estándar, o
stdout
.
El comando
console.error()
volca los datos en la secuencia de error estándar,
stderr
. Los datos enviados a
stderr
a la consola, aunque lo que se envía a este flujo puede, por ejemplo, redirigirse al archivo de registro de errores.
▍Utilice el color cuando envíe datos a la consola
Para colorear los textos que se muestran en la consola, puede usar secuencias de escape que identifiquen los colores:
console.log('\x1b[33m%s\x1b[0m', 'hi!')
Si ejecuta este comando, por ejemplo, en modo REPL, el texto
hi
se mostrará en amarillo.
Este enfoque, sin embargo, no es particularmente conveniente. Será conveniente utilizar una biblioteca especializada, por ejemplo,
tiza, para mostrar texto en color en la consola . Esta biblioteca, además del formato de color de los textos, admite otras formas de diseñarlos. Por ejemplo, con su ayuda es posible hacer que el texto esté en negrita, cursiva o subrayado.
Para instalarlo desde npm, use el siguiente comando:
npm install chalk
Puedes usarlo así:
const chalk = require('chalk') console.log(chalk.yellow('hi!'))
Usar el
chalk.yellow()
es mucho más conveniente que las secuencias de escape, y el texto del programa con este enfoque es mucho más fácil de leer.
Para obtener más información sobre tiza, consulte esta
página de la biblioteca en GitHub.
▍ Crear una barra de progreso
La barra de progreso puede ser útil en diferentes situaciones. Puede usar el paquete de
progreso para crear indicadores de progreso que se ejecutan en la consola. Puedes instalarlo así:
npm install progress
A continuación se muestra un ejemplo de código en el que se crea un indicador que se puede utilizar para mostrar información sobre una tarea que consta de 10 pasos. En nuestro caso, se requieren 100 ms para completar cada paso. Una vez que el indicador está lleno, se
clearItnerval()
comando
clearItnerval()
y el programa finaliza.
const ProgressBar = require('progress') const bar = new ProgressBar(':bar', { total: 10 }) const timer = setInterval(() => { bar.tick() if (bar.complete) { clearInterval(timer) } }, 100)
▍ Recepción de la entrada del usuario desde la línea de comando
¿Cómo hacer que las aplicaciones de línea de comandos escritas para la plataforma Node.js sean interactivas? A partir de la versión 7, Node.js contiene un módulo de línea de
lectura que le permite recibir datos de secuencias que se pueden leer, por ejemplo, de
process.stdin
. Este hilo, durante la ejecución del programa Node.js, es lo que se ingresa en el terminal. Los datos se ingresan una línea a la vez.
Considere el siguiente fragmento de código:
const readline = require('readline').createInterface({ input: process.stdin, output: process.stdout }) readline.question(`What's your name?`, (name) => { console.log(`Hi ${name}!`) readline.close() })
Aquí le preguntamos al usuario su nombre, y después de ingresar el texto y presionar la tecla
Enter
en el teclado, mostramos un saludo.
El método
question()
muestra lo que se le pasa como primer parámetro (es decir, la pregunta que se le hace al usuario) y espera a que se complete la entrada. Después de presionar
Enter
llama a la devolución de llamada que se le pasó en el segundo parámetro y procesa lo que se ingresó. En la misma devolución de llamada,
readline
interfaz
readline
.
readline
, , .
, , , , , , —
*
.
,
readline-sync , ,
readline
, .
, .
inquirer . :
npm install inquirer
:
const inquirer = require('inquirer') var questions = [{ type: 'input', name: 'name', message: "What's your name?", }] inquirer.prompt(questions).then(answers => { console.log(`Hi ${answers['name']}!`) })
inquirer . , .
Node.js.
readline
, readline-sync inquirer. , , .
Node.js, exports
, API
module.exports
, . Node.js ,
. ,
require
, :
const library = require('./library')
library.js
, , , .
, , - , . , , . , API
module.exports
, .
.
module.exports
, , . :
const car = { brand: 'Ford', model: 'Fiesta' } module.exports = car
,
exports
. , , — :
const car = { brand: 'Ford', model: 'Fiesta' } exports.car = car
:
exports.car = { brand: 'Ford', model: 'Fiesta' }
, , :
const items = require('./items') items.car
:
const car = require('./items').car
module.exports
exports
?
,
module.exports
. .
Node.js-, REPL, , Node.js. npm, , ,
package.json
package-lock.json
.
Estimados lectores! Node.js-?
