如何在Node js中验证API请求

时间:2018-04-02 04:26:18

标签: node.js

我创建了一个简单的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");
            }
        });
  

控制器快照

Controller

4 个答案:

答案 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."
    }
]