我有简单的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)中尝试了catch块,但它仍然给我以下消息:


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


还有这个错误:


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

最佳答案

 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。

10-06 10:41