Use the express.Router class to create modular, mountable route handlers. A Router instance is a complete middleware and routing system; for this reason, it is often referred to as a “mini-app”.
var express = require('express')
var app = express()
var users = [];
app.get('/', function (req, res) {
res.json(users);
})
app.get('/:id', function (req, res) {
const id = req.params.id;
const user = users.find(u => u.id == id);
return res.json(user)
})
app.listen(5000)
server.js
var router = require('express').Router()
var users = [];
router.get('/', function (req, res) {
res.json(users);
})
router.get('/:id', function (req, res) {
const id = +req.params.id;
const user = users.find(u => u.id === id);
return res.send(user)
})
module.exports = router
/api/users/index.js
const express = require('express');
const app = express();
// Applying middlewares and routes
app.use(express.json());
// Resources routers
const usersRouter = require('./api/users');
app.use('/api/users', usersRouter);
app.listen(5000);
server.js
const express = require('express');
const app = express();
// Resources routers
const usersRouter = require('./api/users');
// Applying middlewares and routes
app.use(express.json());
app.use('/api/users', usersRouter);
app.listen(5000);
var axios = require('axios');
var cheerio = require('cheerio');
...
module.exports = {
getHTML : useAxiosToExtractDOM,
extractInfo : parseDOMToDataUsingCheerio
}
function useAxiosToExtractDOM(url) { }
function parseDOMToDataUsingCheerio(html) { }
utils/extractor.js
var app = require('express')();
var extractor = require('./utils/extractor');
app.get('/extractInfo', (req, res) => {
const url = req.queryParams.url;
extractor.getHTML(url)
.then(extractor.extracInfo)
.then( data => res.json(data))
}
server.js
var axios = require('axios');
var cheerio = require('cheerio');
...
module.exports = {
getHTML : useAxiosToExtractDOM,
extractInfo : parseDOMToDataUsingCheerio
}
const router = require('express').Router();
router.get('/', ( req, res) => {
// Code here
});
router.get('/:id', ( req, res) => {
// Code here
});
router.post('/', ( req, res) => {
// Code here
});
module.exports = router;
api/users/index.js
const express = require('express');
const app = express();
// Resources routers
const usersRouter = require('./api/users');
app.use('/api/users', usersRouter);
server.js
const router = require('express').Router();
router.get('/', ( req, res) => {
// Code here
});
router.get('/:id', ( req, res) => {
// Code here
});
router.post('/', ( req, res) => {
// Code here
});
module.exports = router;
api/users/index.js
const router = require('express').Router();
const magic = require('./whereTheMagicHappens');
router.get('/', magic.doWhatever);
router.get('/:id', magic.doWhatever);
router.post('/', magic.doWhatever);
module.exports = router;
/api/users/index.js
index.js 10 líneas
api/users/index.js 8 líneas
api/users/users.controller.js 60 líneas
Queremos desarrollar una api restful con node para un proyecto copia de twitter. Aunque de momento, será solo una primera versión con usuarios y tweets como si fuese un blog personal.
USUARIOS
username* : string<uniq>
name? : string
email* : string
tweetsIDs : string[]
TWEETS
id* : string<uniq>
text : string
owner : string<ID>
createdAt : timestamp
Esto sería un id de los tweets que este usuario había creado
"2 tablas"
OJO ! CONTROLA QUE LA API NO SE PUEDA QUEDAR PILLADA EN NINGÚN MOMENTO, controla campos vacíos, request inválidas, etc etc y devuelve el error en la respuesta y el código correcto para dicho caso
MIDDLEWARES
EVERYWHERE
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
MIDDLEWARES
app.use( (req, res, next) => {
console.log(`Hemos recibido una solicitud a ${req.url}`);
next();
})
Las funciones de middleware son funciones que tienen acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente función de middleware en el ciclo de solicitud/respuestas de la aplicación. La siguiente función de middleware se denota normalmente con una variable denominada next.
app.use(express.json());
app.use( (req, res, next) => {
console.log(`Yo me ejecuto primero`);
req.invalidUser = true;
next();
})
app.use( (req, res, next) => {
console.log(`Y luego yo`);
if (req.invalidUser) return res.sendStatus(401)
else next()
})
app.use('/api/users', usersRouter);
app.use(express.json());
app.use('/api/users', usersRouter);
app.use( (req, res, next) => {
console.log(`Yo me ejecuto primero`);
req.invalidUser = true;
next();
})
app.use( (req, res, next) => {
console.log(`Y luego yo`);
if (req.invalidUser) return res.status(401).send('Invalid Request')
else next()
})
ERROR HAMIGOH
const express = require('express');
const morgan = require('morgan');
const app = express();
app.use(morgan('combined'));
app.listen(5000);
// Use the session middleware
app.use(session({
secret: 'keyboard cat',
cookie: { maxAge: 60000 },
resave: true,
saveUninitialized: true}))
// Access the session as req.session
app.get('/', function(req, res, next) {
if (req.session.views) {
req.session.views++;
res.setHeader('Content-Type', 'text/html');
res.send(`<p>views: ${req.session.views}</p>
<p>expires in: ${req.session.cookie.maxAge / 1000}s</p>`);
} else {
req.session.views = 1;
res.end('welcome to the session demo. refresh!');
}
})
errorhandler + otros loggers
const app = require('express')();
const errorhandler = require('errorhandler')
const notifier = require('node-notifier');
app.use(errorhandler( { log : errorNotification } ));
app.listen(5000);
function errorNotification (err, str, req) {
var title = 'Error in ' + req.method + ' ' + req.url
notifier.notify({
title: title,
message: str
})
}
errorhandler + otros loggers
const app = require('express')();
const errorhandler = require('errorhandler')
const notifier = require('node-notifier');
if (process.env.NODE_ENV === 'development'){
app.use(errorhandler( { log : errorNotification } ));
}
app.listen(5000);
function errorNotification (err, str, req) {
var title = 'Error in ' + req.method + ' ' + req.url
notifier.notify({
title: title,
message: str
})
}
var compression = require('compression')
var express = require('express')
var app = express()
// compress all responses
app.use(compression())
// add all routes
var cors = require('cors');
var app = require('express')();
app.use(cors());
{
"origin": "*",
"methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
"preflightContinue": false,
"optionsSuccessStatus": 204
}
var app = require('express')();
var cors = require('cors')
var corsOptions = {
origin: ['http://example.com' , 'http://example2.com' ]
}
app.use(cors(corsOptions));
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
Oye, que me han dicho que ahora sabes usar middlewares, pues mira, estaría interesante que :
¿Y si mejoras el proyecto del TODOLIST?
Para una primera versión, porque no almacenas la lista de todo pero distinta para cada usuario? por ejemplo usando el módulo de express-session e identificando a las sesiones de alguna manera única.
Pero ojo, no queremos que cuando el servidor se reinicie se haya perdido todo.
Y si ... haces que cada mañana a las 9 de la mañana se envíe un correo al usuario que le diga el título de las tareas que aún no ha completado ? Haz que el usuario te indique su id mediante un post a /users