簡體   English   中英

Nodejs Promise拒絕不會轉發錯誤消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM