如何使用快速中间件检查所有请求参数(正文,查询,参数)是否未定义或为null?

时间:2019-04-02 22:24:12

标签: node.js rest express

我正在尝试使用express在NodeJS中编写一个RESTful API,并希望以一般方式检查请求的所有参数是否均未定义或为null。 对于每个传入请求,此检查都应作为中间件运行。

问题描述

我知道有一种方法可以使用req.route获取原始路径。我目前的方法是编写一个中间件函数来获取请求的原始路径,然后在IDL中查找所需的属性/参数,例如昂首阔步。问题是,我还没有针对该API的Swagger规范,也不想修改路径并在Swagger文件中查找每个请求。

还有其他方法可以检查参数是否未定义或为空吗?我提供了一种解决方案,如下面的伪代码所示。

app.use((req, res, next) => {
    // checks for each expected body, query or path param if there is an 
    //     representative in the actual request which is not undefined or null
    if (/* there is such an parameter */) {
        res.sendStatus(400);
        return;
    }
    next();
});

临时解决方法

目前,我有一个函数可以获取参数作为rest参数,并检查它们是否为undefined或null。我有两种不同的方式,可以在下面的示例代码片段中看到。

app.post('/students', (req, res, next) => {
    checkProperties2(res, next, req.body.name, req.body.id, req.body.age);
}, (req, res, next) => {

    let name = req.body.name;
    let id = req.body.id;
    let age = req.body.age
    console.log(`Name: ${name}, ID ${id}, age ${age}`);
    res.status(201).end(JSON.stringify({ msg: 'Created!' }));

});

app.post('/teachers', (req, res, next) => {
    let name = req.body.name;
    let id = req.body.id;
    let age = req.body.age
    if (checkProperties(res, name, id, age)) {
        console.log(`Name: ${name}, ID ${id}, age ${age}`);
        res.status(201).end(JSON.stringify({ msg: 'Created!' }));
    }
});

function checkProperties2(res, next, ...properties) {
    for (let i = 0; i < properties.length; ++i) {
        if (properties[i] == undefined || properties[i] == null) {
            res.status(400).end(JSON.stringify({ msg: 'Bad request!' }));
            return;
        }
    }
    next();
}

function checkProperties(res, ...properties) {
    for (let i = 0; i < properties.length; ++i) {
        if (properties[i] == undefined || properties[i] == null) {
            res.status(400).end(JSON.stringify({ msg: 'Bad request!' }));
            return false;
        }
    }
    return true;
}

这种方法非常有效,但是这样做很烦人,因为我必须以一种方式将其显式添加到每个端点。这样会减少代码的简洁性和可维护性。

0 个答案:

没有答案