En aquest tema, aprendrem com gestionar les rutes en un servidor HTTP creat amb Node.js. El routing és una part fonamental de qualsevol aplicació web, ja que permet definir com es gestionen les diferents peticions que arriben al servidor.
Objectius
- Entendre què és el routing i per què és important.
- Aprendre a definir rutes bàsiques en Node.js.
- Gestionar paràmetres de ruta i consultes.
- Implementar rutes dinàmiques.
Què és el Routing?
El routing és el procés de definir com el servidor respon a les diferents peticions HTTP que arriben a diferents URL. Cada ruta pot estar associada a una funció que s'executa quan es rep una petició a aquesta URL específica.
Definint Rutes Bàsiques
Comencem per crear un servidor HTTP simple i definir algunes rutes bàsiques.
Exemple de Codi
const http = require('http'); const server = http.createServer((req, res) => { if (req.url === '/' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Benvingut a la pàgina principal!'); } else if (req.url === '/about' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Aquesta és la pàgina sobre nosaltres.'); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Pàgina no trobada'); } }); server.listen(3000, () => { console.log('Servidor escoltant al port 3000'); });
Explicació
- Importar el mòdul
http
: Utilitzem el mòdulhttp
per crear el servidor. - Crear el servidor: Utilitzem
http.createServer
per crear el servidor i definir una funció de callback que gestiona les peticions. - Definir rutes: Utilitzem
req.url
ireq.method
per determinar quina ruta s'ha sol·licitat i quin mètode HTTP s'ha utilitzat. - Enviar respostes: Utilitzem
res.writeHead
per establir el codi d'estat i el tipus de contingut, ires.end
per enviar la resposta.
Gestionar Paràmetres de Ruta i Consultes
Les rutes poden incloure paràmetres i consultes que permeten passar informació addicional a la petició.
Exemple de Codi
const url = require('url'); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); const pathname = parsedUrl.pathname; const query = parsedUrl.query; if (pathname === '/user' && req.method === 'GET') { const userId = query.id; res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(`Informació de l'usuari amb ID: ${userId}`); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Pàgina no trobada'); } }); server.listen(3000, () => { console.log('Servidor escoltant al port 3000'); });
Explicació
- Importar el mòdul
url
: Utilitzem el mòdulurl
per analitzar la URL de la petició. - Analitzar la URL: Utilitzem
url.parse
per obtenir el pathname i els paràmetres de consulta. - Gestionar paràmetres de consulta: Utilitzem
parsedUrl.query
per accedir als paràmetres de consulta i utilitzar-los en la resposta.
Implementar Rutes Dinàmiques
Les rutes dinàmiques permeten definir rutes que poden canviar en funció de la informació proporcionada a la URL.
Exemple de Codi
const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); const pathname = parsedUrl.pathname; const userIdMatch = pathname.match(/^\/user\/(\d+)$/); if (userIdMatch && req.method === 'GET') { const userId = userIdMatch[1]; res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(`Informació de l'usuari amb ID: ${userId}`); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Pàgina no trobada'); } }); server.listen(3000, () => { console.log('Servidor escoltant al port 3000'); });
Explicació
- Utilitzar expressions regulars: Utilitzem expressions regulars per identificar rutes dinàmiques.
- Capturar paràmetres de ruta: Utilitzem
pathname.match
per capturar els paràmetres de la ruta i utilitzar-los en la resposta.
Exercicis Pràctics
Exercici 1
Crea un servidor HTTP que gestioni les següents rutes:
GET /
: Retorna "Pàgina principal".GET /contact
: Retorna "Pàgina de contacte".GET /product/:id
: Retorna "Informació del producte amb ID: :id".
Solució
const http = require('http'); const url = require('url'); const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); const pathname = parsedUrl.pathname; if (pathname === '/' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Pàgina principal'); } else if (pathname === '/contact' && req.method === 'GET') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Pàgina de contacte'); } else { const productMatch = pathname.match(/^\/product\/(\d+)$/); if (productMatch && req.method === 'GET') { const productId = productMatch[1]; res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end(`Informació del producte amb ID: ${productId}`); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Pàgina no trobada'); } } }); server.listen(3000, () => { console.log('Servidor escoltant al port 3000'); });
Resum
En aquest tema, hem après què és el routing i com definir rutes bàsiques en un servidor HTTP creat amb Node.js. Hem vist com gestionar paràmetres de ruta i consultes, així com implementar rutes dinàmiques. Aquests conceptes són fonamentals per construir aplicacions web robustes i escalables. En el proper mòdul, explorarem com utilitzar NPM per gestionar paquets en les nostres aplicacions Node.js.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu