该项目是由swagger-node-codegen生成的Node / Express API服务器。其POST API需要一个验证器来检查请求正文的语法。
以下是该问题的两个示例:
服务器将接收请求正文,并且仍将正常处理,这会将值发送到查询函数。
检查POST请求正文的语法并响应错误的适当方法是什么?
答案 0 :(得分:2)
我使用中间件检查POST正文值:https://expressjs.com/en/guide/using-middleware.html
router.post('/create', validateEmpty, (req, res) => {
res.status(200).send({result: "OK"})
})
const validateEmpty = (req, res, next) => {
let value = req.body.value;
if(value.length === 0) {
return res.status(500).send({
error: "empty value"
});
}
// if string value is longer than 0, continue with next function in route
next();
}
答案 1 :(得分:1)
This是用于验证请求正文语法和值的非常好的模块。这是一个例子。
您可以创建一个帮助程序模块requestValidator.js
来验证所有路由请求。考虑使用注册API。
const Joi = require('joi');
module.exports = {
// auth
validateSignUp: (input) => {
const schema = Joi.object().keys({
firstName: Joi.string().required(),
lastName: Joi.string().required(),
email: Joi.string().email({ minDomainAtoms: 2 }).required(),
password: Joi.string().min(6).max(20).required(),
confirmPassword: Joi.string().valid(Joi.ref('password')).required().options({
language: {
any: {
allowOnly: 'must match password'
}
}
}),
gender: Joi.string().required(),
address: addressSchema.required(),
});
return Joi.validate(input, schema);
},
}
在您的authController.js
const { validateSignUp } = require('../helpers/requestValidation');
module.exports = {
signUp: async (req, res, next) => {
const body = req.body;
// validation
const { error } = validateSignUp(body);
if(error) return res.status(400).json({
success: false,
message: error
});
const user = await User.findOne({ email: email.toLowerCase() });
if(user) {
return respondFailure(res, 'the email address you have entered is already registered');
}
const newUser = new User(body);
await newUser.save();
return res.status(400).json({
success: true,
message: 'user registered successfully',
data: newUser
});
},
}
您可以在requestValidator.js
中添加整个应用的请求验证,并在控制器中使用它。
答案 2 :(得分:0)
以上解决方案都可以,但是它们存在一个用于验证正文,查询或参数的快速库。
您可以按照以下步骤操作。
1)。首先通过此命令安装库。
npm install --save express-validator
2)。现在定义了路线,请导入
const { body, query, param } = require("express-validator");
3)。现在,在您的路线中,您可以使用以上任一对象示例。.
router.post('/upload',
[
query('id')
.not()
.isEmpty()
.withMessage('id field can not be empty')
.matches(/^[0-9]+$/)
.withMessage('id must be integer only'),
body('fullName')
.trim()
.not()
.isEmpty()
.withMessage('fullName can not be empty')
.matches(/^[A-Za-z]+$/)
.withMessage('fullName must be Alpha only')
],
userController.fetchProperty
);
在包中定义了许多方法,因为我在上面的示例中使用了其中的一些方法,例如isEmpty(),matches(),isInt()等。
4)。现在,在定义了逻辑的控制器中,您首先需要导入此
const { validationResult } = require("express-validator");
5)。现在在您的逻辑中,您只需要通过传递req来调用此函数,res对象就会对此对象
const checkInputError = (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
res.status(422).json({
message: 'failure',
status: 422,
errors: errors.array()
});
}
};
现在,由于将响应应用于主体,查询或参数,您将收到整个验证错误。
希望这对您或其他人有帮助!
您可以在这里参考更多查询。