[英]Nodejs Promise reject wont forward error messages
我試圖捕捉一個錯誤,指出我試圖讀取的文件不存在。 我故意將文件命名為錯誤。
在我的控制器中,我有getAllProducts()
將返回一個承諾,如果承諾解決,那么我呈現一個頁面,如果沒有,則向控制台顯示錯誤
// inside productController.js
exports.getProductForShop = (req, res, next) => {
productModel.getAllProducts()
.then(products => {
res.render('shop', {
title: 'shop',
products,
path: '/'
});
})
.catch((error) => {
console.log(error);
});
}
在我的模型類中,我已經實現了上面提到的函數,即: getAllProducts()
這里是代碼,它是一個靜態函數,如果這很重要的話
// inside productModel.js
static getAllProducts() {
return new Promise((resolve, reject) => {
fs.readFile('data/wrongName.json', (error, products) => { // wrong file name
if (error) {
reject(new Error(error)); // <-- line that sends error message
}
resolve(JSON.parse(products)); // this is line 52, it should not be executed
})
})
}
當我運行代碼時,我收到以下錯誤消息
SyntaxError: Unexpected token u in JSON at position 0
at JSON.parse (<anonymous>)
at ReadFileContext.callback (C:\Users\user\Desktop\JS\NodeJs\models\productModel.js:52:30)
?[90m at FSReqCallback.readFileAfterOpen [as oncomplete] (fs.js:239:13)?[39m
這一定意味着fs.readFil
e 收到了錯誤的文件名,拋出了錯誤, reject(new Error(error));
被調用,仍然繼續執行第 52 行,其中有resolve();
當我在if(error)
塊中控制台記錄錯誤時,我得到正確的錯誤消息
Error: Error: ENOENT: no such file or directory, open 'C:\Users\user\Desktop\JS\NodeJs\data\wrongName.json'
at ReadFileContext.callback (C:\Users\user\Desktop\JS\NodeJs\models\productModel.js:49:35)
at FSReqCallback.readFileAfterOpen [as oncomplete] (fs.js:239:13)
當我確實return reject(new Error(error));
我得到正確的錯誤信息,與上面顯示的相同。
有人可以向我解釋為什么錯誤消息傳遞給reject(new Error(error));
是不是被catch
塊夾住了?
更新:添加 catch 塊也不起作用,似乎return render
是唯一的方法?! 我的印象是拒絕將承諾置於拒絕狀態並阻止進一步執行
// inside productModel.js
static getAllProducts() {
return new Promise((resolve, reject) => {
fs.readFile('data/productseData.json', (error, products) => {
if (error) {
reject(new Error(error));
}
resolve(JSON.parse(products));
})
}).catch((error) => {
console.log(error);
})
}
你對這里發生的事情有一點誤解。 調用reject
會拒絕promise,后續resolve
不會解析。 到現在為止還挺好。 問題是它不會在沒有return
情況下停止執行。 因此,您實際上是在運行不必要的代碼,而這些代碼恰好會導致錯誤。
您應該確保在出現錯誤時不執行resolve
代碼。 您可以通過return reject
或將resolve
包裝在else
塊中來完成此操作。
請記住,這里的resolve
/ reject
沒有什么特別之處。 它們是簡單的函數調用,函數調用不會停止執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.