Estoy haciendo REST APIS con Express.js. Tengo la siguiente ruta expresa:
/api/customer
Agregué múltiples parámetros de consulta a la ruta de esta manera:
/api/customer?name=jake /api/customer?country=america /api/customer?name=jake&country=america /api/customer?name=jake&limit=10En mis controladores, manejo todos estos con If y hay tantos casos que siento que este método no escalaría, ¿hay una mejor manera de manejar esto?
Este es el código de mi controlador, estoy usando Sequelize para consultar la base de datos:
async function getAllCustomer(queryLimit, page) { const customers = await Customer.findAll({ limit: queryLimit ? parseInt(queryLimit) : null, offset: page ? parseInt(queryLimit) * parseInt(page) : null }); return customers; } async function getCustomerByFirstName(name, queryLimit, page) { return await Customer.findAll({ where: { firstName: name, } }) } async function getCustomerByAddress(address) { return await Customer.findAll({ where: { customerAddress: address } }) } async function getCustomerByNameAddress(name, address) { return await Customer.findAll({ where: { [Op.and]: [ {firstName: name}, {customerAddress: address} ] } }) } async function getCustomer(req, res) { const page = req.query.page; const queryLimit = req.query.limit; const name = req.query.name; const address = req.query.address; let customers; /* User want to find first names */ if (name && !address) { const names = name.split(",") customers = await getCustomerByFirstName(names, queryLimit, page) res.status(200).send(customers) return; } /* User want to find addresses */ if (!name && address) { const addresses = address.split(",") customers = await getCustomerByAddress(addresses, queryLimit, page) res.status(200).send(customers) return; } /* User want to mix both */ if (name && address) { const names = name.split(",") const addresses = address.split(",") customers = await getCustomerByNameAddress(names, addresses, queryLimit, page) res.status(200).send(customers) return; } if (!name && !address) { customers = await getAllCustomer(queryLimit, page) res.status(200).send(customers) return; } }Podrías hacer algo como esto:
async function getCustomer(req, res) { const page = req.query.page; const queryLimit = req.query.limit; const name = req.query.name; const address = req.query.address; let query = { }; if(name) { query.firstName = name; } if(address) { query.address = address; } let customers = await getCustomers(query, queryLimit, page); res.status(200).send(customers) return; } async function getCustomers(query, queryLimit, page) { const customers = await Customer.findAll({ where: query, limit: queryLimit ? parseInt(queryLimit) : null, offset: page ? parseInt(queryLimit) * parseInt(page) : null }); return customers; } Por cierto, en su código, las funciones getCustomerByFirstName , getCustomerByAddress y getCustomerByNameAddress esperan recibir el name y address como parámetro de cadena, pero está pasando una matriz de names y addresses . Esto podría dar lugar a errores...