我正在尝试使用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;
}
这种方法非常有效,但是这样做很烦人,因为我必须以一种方式将其显式添加到每个端点。这样会减少代码的简洁性和可维护性。