как сделать одну функцию вместо 3 функций?

#javascript #node.js #mongodb #mongoose #routes

#javascript #node.js #mongodb #мангуст #маршруты

Вопрос:

Я заметил, что единственное, что меняется, — это Product.find({type:''}) в трех функциях, поэтому они все одинаковые…

могу ли я заставить одну функцию выполнять ту же работу?

routes.js файл :

     mainRouter.get('/showChips',showChips);
    
    mainRouter.get('/showJuices',showJuices);
    
    mainRouter.get('/showSoftDrinks',showSoftDrinks);
  

controller.js файл :

 const showChips = async (req,res)=>{
    const chipsItems = await Product.find({type:'chips'});
    console.log(chipsItems);
    res.json(chipsItems)

};

const showJuices = async (req,res)=>{
    const juicesItems = await Product.find({type:'juices'});
    console.log(juicesItems);
    res.json(juicesItems)
};

const showSoftDrinks = async (req,res)=>{
    const softDrinksItems = await Product.find({type:'Soft Drinks'});
    console.log(softDrinksItems);
    res.json(softDrinksItems)
};
  

Ответ №1:

Вы можете создать функцию более высокого порядка, которая возвращает функцию .find определенного типа:

 const makeShowProduct = type => (req, res) => {
  Product.find({ type })
    .then(result => res.json(result))
    .catch(handleErrors); // don't forget this part - don't create unhandled rejections
};
  
 router
  .get('/showChips', makeShowProduct('chips'))
  .get('/showJuices', makeShowProduct('juices'))
  .get('/showSoftDrinks', makeShowProduct('Soft Drinks'))
  

Комментарии:

1. почему это так? handleErrors не определен

2. Его реализация зависит от вас, но вам нужно что- то в .catch — необработанные отклонения устарели и приведут к завершению работы узла в новых версиях. Выясните, что вы хотите сделать, если обнаружена ошибка, и реализуйте это в функции.