En el proyecto MEAN stack, hay 2 formas de funciones Express aquí: una que toma un parámetro de fecha y la otra que no, y la única diferencia es el segundo componente de URL y el nombre del método aws.
-->¿Cómo puedo definir 2 funciones con todo el código, que toman el componente URL como parámetro, construyen el nombre del método aws a partir de eso y luego devuelven la función Express, reduciendo así el código que necesitamos mantener?
archivo app.js
API que no toman la fecha como parámetro
const AWS = require("../db/data"), aws = new AWS("aws_" + config.db.release.set); router.get('/data/quern', (req, res) => { aws.getdataquern() .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); }); router.get('/data/quern1', (req, res) => { aws.getdataquern1() .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); }); router.get('/data/quern2', (req, res) => { aws.getdataquern2() .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); });Api's que toma la fecha como parámetro
router.get('/data/withDate/:date', (req, res) => { aws.getdatawithDate(req.params.date) .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); }); router.get('/data/withDate1/:date', (req, res) => { aws.getdatawithDate1(req.params.date) .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); }); router.get('/data/withDate2/:date', (req, res) => { aws.getdatawithDat2(req.params.date) .then( record => { res.status(200).send(record) }, error => { res.status(500).send(error) }); });Puede usar una función común para todos ellos donde pasa el método aws que desea llamar como una cadena y pasa cualquier argumento que desee pasar a esa función. Además, tenga en cuenta que .status(200) no es necesario ya que ese ya es el estado predeterminado.
const AWS = require("../db/data"), aws = new AWS("aws_" + config.db.release.set); function handleResponse(res, awsFnName, arg) { aws[awsFnName](arg).then( record => { res.send(record) }, error => { res.status(500).send(error) } ); } router.get('/data/quern', (req, res) => { handleResponse(res, "getdataquern"); }); router.get('/data/quern1', (req, res) => { handleResponse(res, "getdataquern1"); }); router.get('/data/quern2', (req, res) => { handleResponse(res, "getdataquern2"); }); router.get('/data/withDate/:date', (req, res) => { handleResponse(res, "getdatawithDate", req.params.date) }); router.get('/data/withDate1/:date', (req, res) => { handleResponse(res, "getdatawithDate1", req.params.date) }); router.get('/data/withDate2/:date', (req, res) => { handleResponse(res, "getdatawithDate2", req.params.date) });Tenga en cuenta que si las declaraciones de ruta en sí mismas fueran realmente así de repetitivas, podrían basarse en una tabla en la que genere todas las rutas en un ciclo al iterar una tabla de parámetros. Así es como se podrían generar las rutas en sí:
const AWS = require("../db/data"), aws = new AWS("aws_" + config.db.release.set); function handleResponse(res, awsFnName, arg) { aws[awsFnName](arg).then( record => { res.send(record) }, error => { res.status(500).send(error) } ); } ["quern", "quern1", "quern2"].forEach(suffix => { router.get(`/data/${suffix}`, (req, res) => { handleResponse(res, `getdata${suffix}`); }); }); ["withDate", "withDate1", "withDate2"].forEach(suffix => { router.get(`/data/${suffix}/:date`, (req, res) => { handleResponse(res, `getdata${suffix}`, req.params.date); }); });Este código genera las seis rutas.
No siempre soy un gran admirador de las rutas generadas porque no es tan claro para un lector del código exactamente qué rutas está registrando este código. Obviamente, se puede resolver estudiando el código, pero el primer método anterior tiene algunas ventajas de mantenimiento, aunque tiene un poco más de redundancia en el código.