fs.readFile中的return语句导致未处理的承诺被拒绝

时间:2019-05-15 15:00:59

标签: javascript node.js json express fs

我有一个简单的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
     })
   }

我在fs.readFile所在的函数(router.post)中有try catch块,但它仍然给我以下消息:

  

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。这个   错误是由于抛出异步函数而导致的   阻止,或者拒绝未由.catch()处理的承诺。

还有此错误:

  

UnhandledPromiseRejectionWarning:错误:发送标头后无法设置标头。

1 个答案:

答案 0 :(得分:1)

 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
     });
 }

您可以尝试执行此操作,这仅应使用200或409或500个状态代码调用一次res.send。