оператор возврата внутри fs.readFile, вызывающий необработанное отклонение обещания - PullRequest
1 голос
/ 15 мая 2019

У меня есть простая fs.readFile функция для чтения данных файла json, получения одного из его свойств (массива) и проверки, содержит ли этот массив каждый элемент массива, созданного пользователем, и я использую этот код для этой цели

const contains = (arr1, arr2) =>
   arr2.every(v => arr1.indexOf(v) !== -1)

 fs.readFile('../tags.json', 'utf8', (err, data)=>{

    if(err) return res.status(500).send({message: err.message});

   var JsonData = JSON.parse(data);
   var tagsArray = JsonData.tags;
   console.log(tagsArray)
   console.log(tags)
   if(tagsArray instanceof Array){
     console.log('tagsArray is array')
   }
   var bool = contains(tagsArray, tags)
   if(!bool){
      return res.status(409).send({
        message: 'don't provide your own tags'
      })
   }

 })
  const user = await User.findById(req.userId, '-password').lean()

 const book = await Dish.create({
    //properties
 })

 return res.status(200).send({var: JSON.stringify(book)})

 } catch (error) {
     return res.status(500).send({
       message: error.message
     })
   }

у меня есть попытка перехватить блок внутри функции (router.post), где fs.readFile, но он все равно выдает мне следующее сообщение:

UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо в результате выброса внутри асинхронной функции без блока catch, либо в результате отклонения обещания, которое не было обработано с помощью .catch ().

, а также этой ошибки:

UnhandledPromiseRejectionWarning: Ошибка: невозможно установить заголовки после их отправки.

1 Ответ

1 голос
/ 15 мая 2019
 const contains = (arr1, arr2) =>
   arr2.every(v => arr1.indexOf(v) !== -1)

 let match = false;
 fs.readFile('../tags.json', 'utf8', (err, data)=>{

   var JsonData = JSON.parse(data);
   var tagsArray = JsonData.tags;
   console.log(tagsArray)
   console.log(tags)
   if(tagsArray instanceof Array){
     console.log('tagsArray is array')
   }
   match = contains(tagsArray, tags)   

 });
 const user = await User.findById(req.userId, '-password').lean()

 const book = await Dish.create({
    //properties
 });

 if(!match){
    return res.status(409).send({
      message: 'don't provide your own tags'
    });
 }

 return res.status(200).send({var: JSON.stringify(book)})


 } 
 catch (error) {
     return res.status(500).send({
       message: error.message
     });
 }

Вы можете попробовать это, он должен вызывать res.send только один раз, с 200, или 409, или 500 кодами состояния.

...