Борется с обратными вызовами на маршрутах - NodeJS - PullRequest
0 голосов
/ 14 мая 2018

В моем бэкэнде nodejs у меня есть маршрут, который удаляет продукты.Поскольку пользователи могут загружать изображение, связанное с продуктом, соответствующее изображение также необходимо удалить.Но я изо всех сил пытаюсь сделать это.

Мои ноды:

productRoutes.route('/delete/:id').get(function (req, res) {
    const id = req.params.id;
    Product.find({_id: id}).select('name').exec().then(product => {
        var name = product[0].name;
        rimraf('uploads/imgs/' + name, function () {
            console.log('uploads/imgs/' + name + ' deleted');
        });
    });
    Product.remove({_id: id})
        .exec()
        .then(result => {
            res.status(200).json(result);
        })
        .catch(err => {
            res.status(500).json({
                error: err
            });
        });
});

Сначала я ищу название продукта, которое необходимо удалить.Затем я удаляю его папку с помощью rimraf.

И затем продукт должен быть удален.Теперь я знаю, что делаю это неправильно из-за асинхронности NodeJS.И будет ошибка, что переменная имени не определена, потому что NodeJS работает асинхронно.

Но я действительно изо всех сил пытаюсь сделать это правильно.Ребята, вы можете помочь?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

В таких ситуациях вы всегда можете пойти с понятием Promises или async/await.Эти концепции появились, имея в виду, что node.js по своей природе асинхронный , а иногда может потребоваться синхронная природа.В случаях, когда операции, которые вы должны выполнять синхронно, равны 2 или 3 (лучше придерживаться 2), хорошо использовать вложенных обратных вызовов .Однако большее количество вложенных обратных вызовов породило концепцию обратного вызова ада .Следовательно, ваша цель может быть выполнена, но код более отвратительный, чем когда-либо.

Лучшие практики -

Использование Обещания везде, где это возможно -

new Promise((resolve, reject) => {
    // Product.find(... goes here.
    /* inside the callback of Product.find, if error is encountered, do - 
       reject(err);
    */
     /* else, if everything works fine - 
        resolve(data);
     */
}).then((data) => {
     // Product.remove goes here
}).catch((err) => {
     // error handling goes here
});

Вы также можете использовать async /ожидайте функцию для достижения этой цели.Методология четко описана в указанной мной ссылке.

Надеюсь, это поможет.

0 голосов
/ 14 мая 2018

Это проще, если вы используете метод findOneAndRemove, который объединяет поиск и удаление документа в один шаг:

productRoutes.route('/delete/:id').get(function (req, res) {
    const id = req.params.id;
    Product.findOneAndRemove({_id: id}, {select: 'name'}, (err, doc, result) => {
        if (err) {
            res.status(500).json({
                error: err
            });        
        }
        else if (doc) {
            rimraf('uploads/imgs/'+ name, function(){
                console.log('uploads/imgs/'+name + ' deleted');
                res.status(200).json(result);
            });    
        }
        else {
            // Don't forget to handle the "id not found" case
            res.send(404);
        }
    });
});
0 голосов
/ 14 мая 2018

Обратные вызовы упрощают:

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

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

Product.find({_id: id},(err,data)=>{
      if(err)throw err;
      else{
          data.select('name',(err,newData)=>{
            if(err)throw err;
            var name= newData[0].name;
            //your product will be the final filtered data 
            //you got the idea further you can proceed 
           }
           )
      }
})                   

Я считаю, что это проще и удобнее в обслуживании по сравнению с обещаниями, exec, async await. Просто помните, что каждый метод будет фильтровать данные, поэтому вызывайте данные данные конкретными методами.Надеюсь, что вы получили, это займет много времени, чтобы написать ответ, особенно если вы новичок здесь, пожалуйста, попытайтесь понять, что я пишу спасибо

...