Para esta lección necesitamos crear un servidor HTTP que sirva el mismo archivo de texto cada vez que el servidor recibe una petición. Al igual que en la lección anterior, el servidor debería escuchar en el puerto que proporciona el primer argumento al programa (process.argv[2]). Se proporcionará una ubicación al archivo como segundo argumento del programa. A diferencia de la lección anterior, necesitamos crear un servidor HTTP en lugar de un servidor TCP.

Leccion-11 learnyounode Lección 11 – HTTP File Server

Esta lección requiere que usemos el método fs.createReadStream() para transmitir el contenido del archivo a la respuesta de nuestro servidor en lugar de usar el método fs.readFile(). ¿Cuál es la diferencia? El método fs.readFile() leerá el archivo completo en la memoria antes de enviarlo a la respuesta, mientras que el método fs.createReadStream() transmitirá el contenido del archivo a la respuesta a medida que se lee. Esto puede ser más rápido en algunos casos y usar menos memoria.

Al crear un flujo de lectura, podemos utilizar el método pipe() para transmitir el contenido de nuestros archivos desde la fuente (el archivo) al destino (la respuesta). La firma para el método pipe es source.pipe(destination), aunque la verá representada como src.pip(dst) en la sugerencia del tutorial. La conclusión es que podemos conectar un flujo de sistema de archivos a un flujo de respuesta.

Solución

var http = require(‘http’)
var fs = require(‘fs’)
 
var port = process.argv[2]
var file = process.argv[3]
 
http.createServer(function (request, response) {
  fs.createReadStream(file).pipe(response)
}).listen(+port, function () {
  console.log(‘Server listening on http://localhost:%s’, port)
})

La solución que se me ocurrió es muy similar a la solución oficial. Estoy pasando los módulos http y fs a las variables http y fs. Además, estoy pasando el primer y segundo argumento (process.argv[2] y process.argv[3]) a mi programa al puerto de variables y al archivo. No es necesario pasar ninguno de los dos argumentos a una variable. Sin embargo, encuentro que es útil para traer contexto y legibilidad a mi programa al nombrar los propósitos de esos argumentos.

Después de declarar mis variables, estoy usando el método http.createServer() y pasando una función de devolución de llamada como argumento. La función de devolución de llamada toma dos argumentos llamados solicitud y respuesta. Dentro de mi función de devolución de llamada, estoy usando el método fs.createReadStream() para transmitir mi archivo a la memoria.

Entonces estoy pasando esa corriente al objeto de respuesta de mi función de devolución de llamada con el método pipe(). Finalmente, estoy escuchando en el puerto que se pasa a mi programa vía process.argv[3] con el método http.listen(). En lugar de llamar al método createServer(), lo añado al final del método http.createServer con la firma http.createServer().listen(). Dentro del método listen(), también estoy pasando una función de devolución de llamada como argumento. Cuando se hace una conexión, mi función de devolución de llamada registra la url de mi servidor en la consola y le dice al usuario que el servidor está escuchando.

Vale la pena mencionar que a menudo veo a gente colocando el mensaje «el servidor está escuchando» fuera de una función de devolución de llamada. Hasta donde yo sé, esta no es la manera correcta de hacerlo porque el servidor está escuchando el mensaje puede ser registrado en la consola antes de que el servidor esté realmente escuchando. Es mejor colocar este mensaje en una devolución de llamada para que el usuario final sepa que el servidor está escuchando.

Solución oficial

var http = require(‘http’)
var fs = require(‘fs’)
 
var server = http.createServer(function (req, res) {
  res.writeHead(200, { ‘content-type’: ‘text/plain’ })
 
  fs.createReadStream(process.argv[3]).pipe(res)
})
 
server.listen(Number(process.argv[2]))

La solución oficial difiere sólo ligeramente. La diferencia clave es que después de llamar al método createServer(), el método writeHead() se llama dentro de una función de devolución de llamada que se pasa al método createServer() como argumento. Los datos que se escriben en la cabecera son el código de éxito http (200), así como un objeto JSON que contiene el tipo de contenido. Esta es realmente la mejor práctica. Si lo desea, puede llevar esto un paso más allá y también escribir la longitud del contenido en la cabeza de la respuesta usando el método length() para calcular la longitud de sus datos.

Reader Interactions

Deja un comentario

Tu dirección de correo electrónico no será publicada.

About David Moya

Apasionado de la Seguridad Informática, aprendiendo en todo momento y profundizando en el mundo web y en el posicionamiento en buscadores.

Share This