【发布时间】: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