En el terminal, verifica que tengas instalado NodeJS y NPM, con:
node -v
npm -v
Inicialice un nuevo proyecto de Node.js, con:
npm init -y
Instale las dependencias Express (framework
de backend
), nodemon (para reiniciar el servidor automáticamente durante el desarrollo) y body-parser (manejar solicitudes con datos en el cuerpo del requerimiento).
npm install express body-parser
npm install --save-dev nodemon
Instale el Firebase Admin SDK
.
npm install firebase-admin
Cree el archivo ./server.js con el código del servidor
:
const express = require('express');
const bodyParser = require('body-parser');
const admin = require('firebase-admin');
const serviceAccount = require('./config/firebaseConfig.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
const app = express();
app.use(bodyParser.json());
const PORT = process.env.PORT || 5000;
app.use('/api', require('./routes/api'));
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Cree el archivo ./routes/api.js con el código del manejador de rutas
o enrutador
:
const express = require('express');
const router = express.Router();
const itemController = require('../controllers/itemController');
router.post('/items', itemController.createItem);
router.get('/items', itemController.getAllItems);
module.exports = router;
Cree el archivo ./controllers/itemController.js con el código del controlador
:
const admin = require('firebase-admin');
const db = admin.firestore();
exports.createItem = async (req, res) => {
try {
const data = req.body;
const itemRef = await db.collection('items').add(data);
res.status(201).send(`Created a new item: ${itemRef.id}`);
} catch (error) {
res.status(400).send(error.message);
}
};
exports.getAllItems = async (req, res) => {
try {
const itemsSnapshot = await db.collection('items').get();
const items = [];
itemsSnapshot.forEach((doc) => items.push({ id: doc.id, ...doc.data() }));
res.status(200).json(items);
} catch (error) {
res.status(400).send(error.message);
}
};
(STOP 2) Verifica la estructura de carpetas y archivos.
Agregue el script start en ./package.json.
...
"scripts": {
"start": "nodemon server.js",
...
}
...
(STOP 3) Desde la línea de comandos, inicie el servidor:
npm start
Desde una nueva línea de comandos, utilice cURL para realizar las peticiones al REST API
:
curl -X POST http://localhost:5000/api/items -H "Content-Type: application/json" -d "{\"tags\":[\"tag1\",\"tag2\"],\"question\":\"Which band?\",\"answers\":[{\"id\":\"a0\",\"answer\":\"Answer1\"},{\"id\":\"a1\",\"answer\":\"answer2\"}]}"
curl -X GET http://localhost:5000/api/items -H "Accept: application/json"
En grupos de tres (3) personas, completen las siguientes tareas. Pueden utilizar la documentación oficial o un LLM.
Complete el código del controlador ./controllers/itemController.js con las operaciones CRUD
con el Firebase Admin SDK. Como parte de la respuesta, considere los estados HTTP
(200, 400 y 404).
...
exports.getItem = async (req, res) => { }
exports.updateItem = async (req, res) => { }
exports.deleteItem = async (req, res) => { }
...
exports.getItem = async (req, res) => {
try {
const itemId = req.params.id;
const itemDoc = await db.collection('items').doc(itemId).get();
if (!itemDoc.exists) {
res.status(404).send('Item not found');
} else {
res.status(200).json({ id: itemDoc.id, ...itemDoc.data() });
}
} catch (error) {
res.status(400).send(error.message);
}
};
exports.updateItem = async (req, res) => {
try {
const itemId = req.params.id;
const data = req.body;
const itemRef = db.collection('items').doc(itemId);
await itemRef.update(data);
res.status(200).send('Item updated');
} catch (error) {
res.status(400).send(error.message);
}
};
exports.deleteItem = async (req, res) => {
try {
const itemId = req.params.id;
await db.collection('items').doc(itemId).delete();
res.status(200).send('Item deleted');
} catch (error) {
res.status(400).send(error.message);
}
};
Complete el código del enrutador ./routes/api.js con las relaciones de los métodos HTTP
con las funciones del controlador:
...
router.get( , );
router.put( , );
router.delete( , );
...
router.get('/items/:id', itemController.getItem);
router.put('/items/:id', itemController.updateItem);
router.delete('/items/:id', itemController.deleteItem);
Utilice otra línea de comandos para verificar el funcionamiento de su REST API mediante peticiones cURL.
set ID=#ID de un objeto almacenado#
curl -X GET http://localhost:5000/api/items/%ID% -H "Accept: application/json"
curl -X PUT http://localhost:5000/api/items/%ID% -H "Content-Type: application/json" -d "{\"tags\":\"\",\"question\":\"\",\"answers\":\"\"}"
curl -X DELETE http://localhost:5000/api/items/%ID% -H "Accept: application/json"
#REST #API what is it?
— Terrasoft Ltd (@Terrasoft_ltd) December 6, 2023
Representational State Transfer
This means that when a #client requests a resource using a REST API, the #server transfers back the current state of the resource in a standardized representation pic.twitter.com/xCFXw9cQFZ
framework, backend, servidor, enrutador, controlador, SDK, CRUD, métodos HTTP, estados HTTP