Para esta lección necesitamos crear un servidor HTTP que sólo acepte peticiones POST. El cuerpo del POST debe convertirse en una cadena en mayúsculas y devolverse al cliente a través de la respuesta del servidor.
Como en las lecciones anteriores, el servidor debería escuchar en el puerto proporcionado como primer argumento al programa (process.argv[2]).
En la lección anterior aprendimos un poco sobre tuberías y streaming. Aunque no es obligatorio, el uso de las APIs de streaming de peticiones y respuestas hará que esta lección sea mucho más fácil. Además, podemos usar módulos de nodos para ayudarnos, como through2-map, que pueden ser usados para transformar datos de streaming.
Una solución
var http = require(‘http’)
var map = require(‘through2-map’)
var port = process.argv[2]
http.createServer(function (request, response) {
// check to see if request method is POST
if (request.method === ‘POST’) {
// write request status and content type to resposne head response.writeHead(200, {‘Content-Type’: ‘text/plain’})
// stream request to through2-map with pipe() request.pipe(map(function (chunk) {
// convert request to uppercase string
return chunk.toString().toUpperCase()
// stream result to response with pipe()
})).pipe(response)
} else {
// write method not allowed error to response header if method not POST response.writeHead(405)
}
}).listen(+port, function () {
console.log(‘Server listening on http://localhost:%s’, port)
})
En la solución anterior, estamos asignando los módulos http y through2-map a las variables http y map. También estamos asignando el primer argumento de nuestro programa al puerto variable.
A continuación, creamos un servidor y pasamos una función de devolución de llamada que acepta una petición y una respuesta como argumentos. Dentro de nuestra devolución de llamada, estamos comprobando si el método de la petición (request.method) enviada a nuestro servidor es igual a POST. Si es así, estamos escribiendo el estado 200 y el tipo de contenido al cabezal de respuesta y canalizando la petición al método map().
Al método map() se le pasa una llamada de retorno que acepta chunk como argumento. Dentro de esta llamada de retorno están devolviendo el valor de nuestro portabrocas, que se convierte en una cadena en mayúsculas con los métodos toString() y toUpperCase(). Luego estamos pinchando el valor devuelto a la respuesta con el método pipe().
Si el método de solicitud no es igual a POST, estamos escribiendo el estado 405 al cabezal de respuesta. El código de error 405 es el código de error utilizado si no se permite un método, como GET.
Finalmente, estamos escuchando el puerto pasado como primer argumento al programa, coaccionando el puerto a un número usando el operador unary +, y registrando la ubicación del servidor en la consola.
A modo de comparación, la solución oficial se pega a continuación.
Solución oficial
var http = require(‘http’)
var map = require(‘through2-map’)
var server = http.createServer(function (req, res) {
if (req.method != ‘POST’)
return res.end(‘send me a POST\n’)
req.pipe(map(function (chunk) {
return chunk.toString().toUpperCase()
})).pipe(res)
})
server.listen(Number(process.argv[2]))
Deja una respuesta