我的 Express API 公開了一個 POST 端點來創建用戶,我需要在將資料插入資料庫之前驗證資料,我有兩種方法:
方法 1:在控制器中包含模型的驗證,并對每個模型重復:
// controllers/users.js
exports.createUser = async function (req, res) {
const { username, email, password } = req.body;
/* validation logic */
/* interact with db */
方法2:將驗證邏輯移至專用中間件:
// middleware/validators.js
exports.validateArticle = function (req, res, next) {};
exports.validateComment = function (req, res, next) {};
exports.validateUser = function (req, res, next) {
const { username, email, password } = req.body;
/* validation logic */
if (!isValid) {
return res.statusCode(400);
}
next();
};
// routes/users.js
const { validateUser } = require('../middlewares/validators');
router.route('/').post(validateUser, createUser);
我對方法 2 的擔憂是,一種端點方法的邏輯會分散在許多檔案中,但是這些方法中的哪一種遵循最佳實踐?
uj5u.com熱心網友回復:
問題是規模問題之一。如果一個控制器中有很多不同的路由,或者如果你只有多個控制器,那么就很難保持干凈和易于理解。控制器不應該比顯示傳入請求如何路由和回傳所需的更多。其他所有重要的東西都應該傳遞給中間件服務。因此,如果您想要增長空間,第二種選擇往往會更好。
此外,通過將所有驗證邏輯放在一起,您可以輕松地在適用的情況下重用代碼。
如果這是非常靜態的并且您不希望添加新的路由或控制器,選項 1 可以解決。
uj5u.com熱心網友回復:
我可以建議您使用現成的中間件express-validator,并進行如下設定:
// src/validation/validation.js
const { validationResult } = require('express-validator');
const validate = (schemas) => {
return async (req, res, next) => {
await Promise.all(schemas.map((schema) => schema.run(req)));
const result = validationResult(req);
if (result.isEmpty()) {
return next();
}
const errors = result.array();
return res.send({
message: 'Validation error',
errors: errors,
})
};
}
module.exports = {
validate
}
這是一個你可以像路由器中的中間件一樣呼叫的函式,然后是一個帶有驗證規則的檔案。
// src/validation/validationSchemas.js
const { body } = require('express-validator');
const addUserSchema = [
body('username').isLength({ min: 4, max: 16 }).withMessage('Username must be at least 4 and no more than 16 characters'),
body('email').isEmail().withMessage('Incorrect email')
];
module.exports = { addUserSchema }
在您的路由器中:
const { validate } = require('../validation/validation');
const { registrationSchema, loginSchema } = require('../validation/validationSchemas');
router.post('/registration', validate(registrationSchema), userController.registration);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406230.html
標籤:
