【问题标题】:return statement inside fs.readFile causing Unhandled promise rejectionfs.readFile 中的 return 语句导致未处理的承诺拒绝
【发布时间】:2019-10-02 18:39:31
【问题描述】:

我有简单的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:错误:发送后无法设置标头。

【问题讨论】:

  • 那么承诺拒绝来自哪里?您没有显示错误所在的代码。
  • 调用此函数后是否调用 res.send?
  • 是的,但是有 200 个状态码,并且在 try catch 块中有 500 个状态码
  • 你只能调用 res.send 一次所以你的错误是因为你调用 res.send 第二次
  • @GifCo 控制台将我指向 catch() 所在的行,但我确信这个块有问题,因为如果我删除它,代码就会开始工作

标签: javascript node.js json express fs


【解决方案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
     });
 }

您可以试试这个,这应该只调用 res.send 一次,可以使用 200、409 或 500 状态码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2023-03-17
    • 2018-04-01
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多