我正在從 API 獲取資料并將其顯示在我的本地服務器上。
下面是我從 API 資料中獲取與 ID 匹配的資料的代碼:
router.get('/:id', async (req, res) => {
checkString(req.params.id)
try {
const person = await peopleData.getPersonById(req.params.id);
res.json(person);
} catch (e) {
res.status(404).json({ message: 'There is no person with that ID' });
}
如果沒有匹配,我想像在 catch 塊中那樣顯示訊息,但代碼不會去那里,因為從技術上講,沒有匹配不是錯誤。
所以我嘗試了以下代碼來獲取此訊息:
router.get('/:id', async (req, res) => {
checkString(req.params.id)
try {
const person = await peopleData.getPersonById(req.params.id);
if(!person) res.json('There is no person with that ID'); // Added new line here
res.json(person);
} catch (e) {
res.status(404).json({ message: 'There is no person with that ID' });
}
這可以作業,但它會將帶有引號的訊息列印為字串,如果找不到匹配項,有沒有辦法可以在 catch 塊中顯示訊息?
uj5u.com熱心網友回復:
你可以拋出一個錯誤,catch 會顯示它。
if(!person) throw new Error("There is no person with that ID");
....
然后在抓...
catch(e){
res.status(404).json({ message: e.message })
}
uj5u.com熱心網友回復:
如果您將人們發送到全屏“錯誤堆疊”頁面,那么您可能不需要使用 res.json()!您也可以使用 res.send()
if(!person){ res.send('<p>There is no person with that ID</p>'; return; }
// Or
if(!person){ res.send('There is no person with that ID'; return; }
uj5u.com熱心網友回復:
您正在回傳 Json 回應,因此看起來您的消費者不是網頁而是另一個應用程式。如果是這樣,您應該回傳undefined或者null如果沒有找到人,并讓網頁或消費者決定顯示什么訊息。原因是:
- 修改網頁應該比修改代碼更容易,通常 UI 或營銷人員總是希望微調(通常是多次)網頁上的每條訊息。
- 您的應用程式是一個 API 應用程式。顯示用戶未找到訊息的位置可能離我們很遠。或者根本不顯示訊息可能是不合適的,例如,如果未找到用戶,消費應用程式可能希望重定向到/顯示注冊頁面。
- 您的網站可能是多語言的,您不希望后端參與其中。
在許多情況下,“找不到用戶”并不是真正的錯誤,但這完全取決于您的應用程式。
您的情況下的 catch 塊應該用于處理其他錯誤,例如,您的資料庫服務器可能已關閉,或者資料庫請求可能已超時等。如果有,您當前的代碼將誤導性地顯示“找不到用戶”資料庫錯誤!
我還會讓 Express 錯誤處理程式處理此類實際錯誤,而不是為您擁有的每個 API 函式編碼錯誤處理:
router.get('/:id', async (req, res, next) => {
checkString(req.params.id);
try {
const person = await peopleData.getPersonById(req.params.id);
res.json(person); // assuming getPersonById returns null if user not found
} catch (e) {
next(e);
});
您的 Express 錯誤處理程式,上面next函式的呼叫所在的位置,應該是這樣的(假設router是您的 Express 應用程式):
router.use((err, req, res, next) => {
let statusCode = err.status || 500;
// Assuming your app need to return only json responses
res.json(err);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/312236.html
標籤:javascript 节点.js json 表达 试着抓
