Nodejs Promise reject 不会转发错误消息
Nodejs Promise reject wont forward error messages
我试图捕获一个错误,指出我试图读取的文件不存在。我故意将文件命名错误。
在我的控制器中,我有 getAllProducts()
将 return 一个承诺,如果承诺解决,那么我呈现一个页面,如果没有,则将错误显示到控制台
// inside productController.js
exports.getProductForShop = (req, res, next) => {
productModel.getAllProducts()
.then(products => {
res.render('shop', {
title: 'shop',
products,
path: '/'
});
})
.catch((error) => {
console.log(error);
});
}
在我的模型中 class 我已经实现了上面提到的功能,即: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
将拒绝承诺,随后的 resolve
将不会解决它。到目前为止,一切都很好。问题是它不会在没有 return
的情况下停止执行。所以你本质上是 运行 不必要的代码,恰好会导致错误。
您应该确保 resolve
代码在出错的情况下不被执行。您可以使用 return reject
或将 resolve
包装在 else
块中来完成此操作。
请记住,这里的 resolve
/reject
没有什么特别之处。它们是简单的函数调用,函数调用不会停止执行。
我试图捕获一个错误,指出我试图读取的文件不存在。我故意将文件命名错误。
在我的控制器中,我有 getAllProducts()
将 return 一个承诺,如果承诺解决,那么我呈现一个页面,如果没有,则将错误显示到控制台
// inside productController.js
exports.getProductForShop = (req, res, next) => {
productModel.getAllProducts()
.then(products => {
res.render('shop', {
title: 'shop',
products,
path: '/'
});
})
.catch((error) => {
console.log(error);
});
}
在我的模型中 class 我已经实现了上面提到的功能,即: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
将拒绝承诺,随后的 resolve
将不会解决它。到目前为止,一切都很好。问题是它不会在没有 return
的情况下停止执行。所以你本质上是 运行 不必要的代码,恰好会导致错误。
您应该确保 resolve
代码在出错的情况下不被执行。您可以使用 return reject
或将 resolve
包装在 else
块中来完成此操作。
请记住,这里的 resolve
/reject
没有什么特别之处。它们是简单的函数调用,函数调用不会停止执行。