node.js - 验证不适用于猫鼬模式
问题描述
当我向我的数据库添加数据时,猫鼬没有验证我在 Schema 上定义的数据类型:
架构:
const mongoose = require("mongoose");
const Postschema = new mongoose.Schema({
nome: {
type: String,
required: true,
trim: true
},
email: {
type: String,
required: true,
trim: true
},
morada: {
type: String,
required: true,
trim: true
}
});
const Post = mongoose.model('Post', Postschema);
module.exports = Post
功能:
const store = (req, res) => {
const post = new Post({ nome: req.body.nome, email: req.body.email, morada: req.body.morada });
post.save().then((post) => {
res.status(201).json(post)
}).catch((e) => res.status(500).json(e))
}
因此,即使我尝试使用数字而不是字符串创建和存储文档(如下所示),即使在我定义它必须是模式中的字符串并且对象以 wring 类型存储后它仍然有效数据。
{
"nome": 1,
"email":"Associado",
"morada":"emailcomercial3@emailcomercial3.com"
}
如您所见,nome 应该是一个字符串,但我可以将它作为整数添加到我的数据库中。我究竟做错了什么?
解决方案
在这种情况下,nome
来自 的字段body
被解释为字符串并Post
创建文档。
如果您需要验证发布请求,您应该使用该express-validator
库并定义一个自定义中间件来处理正文字段:
- 定义一个
validator.js
中间件:
const { body } = require('express-validator');
const validate = (method) => {
switch (method) {
case 'store': {
return [
body('nome')
.not()
.isEmpty()
.withMessage('Nome is required')
.not()
.isNumeric()
.withMessage('Nome should be a string')
.trim()
.escape(),
body('email')
.not()
.isEmpty()
.withMessage('E-mail is required')
.isEmail()
.withMessage('Insert a valid e-mail')
.normalizeEmail(),
body('morada')
.not()
.isEmpty()
.withMessage('Morada is required')
.trim()
.escape(),
];
}
default:
break;
}
};
module.exports = { validate };
- 将
validate
函数store
作为中间件添加到方法定义中:
const { validate } = require('./validator')
// Express router setup...
router.post('/url/to/post/store', validate('store'), store)
- 您可以
store
通过访问validationResult
函数来处理函数中的验证错误。如果出现错误,它将返回一个非空集。
const { validationResult } = require('express-validator');
const store = (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
...
};
推荐阅读
- vb.net - 使用异步/等待更新表单的问题
- python - 带有 ModelMultipleChoiceField 的 Django 表单呈现为空
- computational-geometry - 只有一个已知边的毕达哥拉斯/计算几何
- selenium - Webdriver.io 的 Selenium Fluentwait 实现
- angular - 使用 *ngIf 隐藏组件有时会留下奇怪的填充
- visual-studio - 如何在 VisualStudio 解决方案中确定项目的优先级?
- java - 如何将位置 gps 数据写入变量 Android Studio
- php - 我怎样才能卷曲深度爬行?
- c# - 没有找到合适的方法来覆盖以泛型类型作为参数的方法的错误
- flask-restplus - 分组命名空间