該賞金過期5天。此問題的答案有資格獲得 50聲望賞金。 社區機器人正在尋找有信譽的來源的答案。
我正在使用貓鼬創建一個快速應用程式,目的是將其連接到前端的 React。
我在下面為客戶控制器列出了一些 CRUD 操作,但是我不喜歡這種方法的一些事情。
- 使用
Customer.findById未找到的有效 ObjectID 時,它會回傳null200 回應代碼。如果沒有找到客戶,我希望它回傳 404。我意識到我可以將catch回應更改為 404,但我希望有一些通用的錯誤處理,以防服務器在請求期間出現故障或提供了無效的 ObjectId,這將我帶到我的下一個專案。 - 如果我提供了無效的 ObjectId,我想提供一些有意義的訊息,500 是正確的回應代碼嗎?
- 錯誤處理:我是否以正確的方式回傳錯誤?當前錯誤回傳帶有錯誤訊息的字串。我應該回傳 JSON 嗎?例如
res.status(500).json({error: error.message)。我計劃連接它以做出反應(我仍在學習)并且我認為 UI 需要向用戶顯示這些訊息? findById被重復getCustomerById,updateCustomer和deleteCustomer。我覺得這是不好的做法,必須有一個更精簡的方法?- 我想要一個函式來驗證 ObjectId 是否有效。我知道我可以做到這一點是
routes使用router.params,但我不知道,如果檢查有效的ID應該是在routes檔案中,因為它看起來像是在controller應處理?請參閱下面我做的另一個專案的路線示例。
基于上述內容,改進我的代碼的最佳實踐和建議方法是什么?我已經閱讀了來自 mongoose、mozilla 和 stackoverflow Q&A 的檔案,但它們似乎沒有解決這些問題(至少我找不到)。
我真的經過一些指導或驗證,我所做的事情是正確還是錯誤。
客戶.controller.js
const Customer = require("../models/customer.model");
exports.getCustomers = async (req, res) => {
try {
const customers = await Customer.find();
res.status(200).json(customers);
} catch (error) {
res.status(500).send(error.message);
}
};
exports.getCustomerById = async (req, res) => {
try {
const customer = await Customer.findById(req.params.id);
res.status(200).json(customer);
} catch (error) {
res.status(500).send(error.message);
}
};
exports.addCustomer = async (req, res) => {
try {
const customer = new Customer(req.body);
await customer.save().then(res.status(201).json(customer));
} catch (error) {
res.status(500).send(error.message);
}
};
exports.updateCustomer = async (req, res) => {
try {
const customer = await Customer.findById(req.params.id);
Object.assign(customer, req.body);
customer.save();
res.status(200).json(customer);
} catch (error) {
res.status(500).send(error.message);
}
};
exports.deleteCustomer = async (req, res) => {
try {
const customer = await Customer.findById(req.params.id);
await customer.remove();
res.status(200).json(customer);
} catch (error) {
res.status(500).send(error.message);
}
};
Router.params example
This is a routes file (not related to my current app) and is provided as an example of how I have used router.params in the past.
const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const Artist = require("../models/Artist");
const loginRequired = require("../middleware/loginRequired");
const {
getArtists,
addArtist,
getArtistById,
updateArtist,
deleteArtist,
} = require("../controllers/artistController");
router
.route("/")
.get(loginRequired, getArtists) // Get all artists
.post(loginRequired, addArtist); // Create a new artist
router
.route("/:id")
.get(loginRequired, getArtistById) // Get an artist by their id
.put(loginRequired, updateArtist) // Update an artist by their id
.delete(loginRequired, deleteArtist); // Delete an artist by their id
router.param("id", async (req, res, next, id) => {
// Check if the id is a valid Object Id
if (mongoose.isValidObjectId(id)) {
// Check to see if artist with valid id exists
const artist = await Artist.findOne({ _id: id });
if (!artist) res.status(400).json({ errors: "Artist not found" });
res.locals.artist = artist;
res.locals.artistId = id;
next();
} else {
res.status(400).json({ errors: "not a valid object Id" });
}
});
module.exports = router;
uj5u.com熱心網友回復:
我個人喜歡讓錯誤處理更加全球化,所以我會寫一些類似的東西
constPrettyError = require('pretty-error')
const pe = new PrettyError()
const errorHandler = (err, req, res, next) => {
if (process.env.NODE_ENV !== 'test') {
console.log(pe.render(err))
}
return res
.status(err.status || 500)
.json({ error: { message: err.message || 'oops something went wrong' } })
}
module.exports = errorHandler
作為處理程式
在您的索引/服務器檔案中
app.use(errorHandler)
然后在你的處理程式中
} catch (err) {
next(err);
}
舉個例子
if (!artist) next({ message: "Artist not found" ,status:404 });
另外,請注意,您可以自定義此錯誤處理程式以根據需要切換每個狀態的自定義錯誤(或物件)
const errorHandler = (err, req, res, next) => {
if (process.env.NODE_ENV !== 'test') {
console.log(pe.render(err))
}
const messagePerStatus = {
404: 'not found',
401: 'no authorization'
}
const message = messagePerStatus[err.status]
return res
.status(err.status || 500)
.json({
error: { message: message || err.message || 'oops something went wrong' }
})
}
那么就
if (!artist) next({status:404 });
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405580.html
標籤:
