我创建了一个简单的API,其中包含所有动词GET,PUT,POST,DELETE,但在此,我想验证POST数据。
我尝试过Joi Libary,但我没有得到正确的方法。
POST方法的CodeSnippet
appRouter.route('/')
.post(function (req, res)
{
if (req.body.ProductName)
{
conn.connect().then(function () {
var transaction = new sql.Transaction(conn);
transaction.begin().then(function () {
var request = new sql.Request(transaction);
request.input("ProductName", sql.VarChar(50), req.body.ProductName)
request.input("ProductPrice", sql.Decimal(18, 0), req.body.ProductPrice)
request.execute("Usp_InsertProduct").then(function () {
transaction.commit().then(function (recordSet) {
console.log(recordSet);
conn.close();
res.status(200).send(req.body);
}).catch(function (err) {
console.log("Error in Transaction Commit " + err);
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
console.log("Error in Transaction Begin " + err);
conn.close();
res.status(400).send("Error while inserting data");
});
}).catch(function (err) {
console.log(err);
conn.close();
res.status(400).send("Error while inserting data");
});
})
.catch(function (err) {
console.log(err);
conn.close();
res.status(400).send("Error while inserting data");
});
}
else {
res.status(400).send("Error while inserting data");
}
});
控制器快照
答案 0 :(得分:2)
您可以使用:谷歌创建的validator他们使用它来验证查询参数,但您可以使用它来验证有效负载。 它的简单和可扩展性
并像这样使用它:
const v = require('./validator')
// then test your payload like this...
const testPayload = (req, res, next) => {
try {
const validate = v.object({
username: v.string, //required field, string
password: v.string, // required field, string
age: v.number, // required field, number
opt: v.optional(v.array(v.string))) // optional field, array of string
})
validate(req.body);
next() // if everything goes well pass it to next middle ware, or handle your payload
}
catch (err) {
next(err) // handling common error
}
答案 1 :(得分:2)
您可以结合使用Joi和中间件来验证所有参数。例如,如果您想从请求正文中验证JsonDocument
,
ProductName
const validateParams = function (paramSchema) {
return async (req, res, next) => {
const schema = Joi.object().keys(paramSchema);
try{
await Joi.validate(paramSchema, schema);
} catch (err) {
return res.send(400, {
status: 400,
result: err.details[0].message
});
}
next();
}
};
function routeFunction (req, res, next) {
// do anything you want to
}
类似地,如果您想验证响应,则可以创建类似的中间件并将Joi用于相同的目的。
答案 2 :(得分:0)
您可以使用自己的中间件功能来验证API。此链接包含有关使用快速框架的中间函数的信息:http://expressjs.com/en/guide/using-middleware.html
您可以使用中间件为您的网址发送POST请求,或者仅使用POST请求。
答案 3 :(得分:0)
我通常是用户express-validator来验证API请求。它基于validator.js。您可以轻松验证类型,字段长度,甚至可以构建自己的自定义函数来验证字段。此软件包还可以非常轻松地向用户返回哪些字段不正确以及原因。
从API调用返回验证错误的示例。
[
{
"location": "params",
"param": "is_active",
"msg": "Missing is_active param."
},
{
"location": "params",
"param": "is_active",
"msg": "is_active param must be boolean true or false."
}
]