Узел ЭкспрессJS |Как пройти проверку параметров пользовательских запросов - PullRequest
2 голосов
/ 07 марта 2019

Обучение ExpressJS здесь. У меня есть маршрут get, который ожидает параметры запроса, т.е.


app.get('/api', (req, res) => {
  res.send({ name: req.query.name, age: req.query.age, club: req.query.club })
})

На почтальоне следующее http://localhost:5000/api?name=Messi&age=31&club=Barcelona

возвращает 200 с res.body как:

{
    "name": "Messi",
    "age": "31",
    "club": "Barcelona"
}

Вопрос

Как я могу написать пользовательскую проверку, где:

  • Если запрошенный параметр запроса не существует: статус 400
  • Если какой-либо из параметров пропущен, т. Е. (Имя, возраст, клуб), вернуть ответ, в котором указано, какой пропущенный параметр (имя, возраст и / или возраст) требуется

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Вы можете создать промежуточное ПО для простой проверки.

function validateQuery(fields) {

    return (req, res, next) => {

        for(const field of fields) {
            if(!req.query[field]) { // Field isn't present, end request
                return res
                    .status(400)
                    .send(`${field} is missing`);
            }
        }

        next(); // All fields are present, proceed

    };

}

app.get('/api', validateQuery(['name', 'age', 'club']), (req, res) => {
  // If it reaches here, you can be sure that all the fields are not empty.
  res.send({ name: req.query.name, age: req.query.age, club: req.query.club })
})

Вы также можете использовать сторонний модуль для проверки запросов.

1 голос
/ 07 марта 2019

Ответы выше: правильно , но как человек, который работал с масштабируемыми и поддерживаемыми API, я бы рекомендовал стандартизировать процесс проверки вашего API с использованием JSON Schemas для определения ожидаемый ввод и AJV для проверки этих схем.

Пример использования:

const Ajv = require('ajv');
const express = require('express');

const app = express();

app.get('/api', (req, res) => {

    // define precisely the expected shape of the request
    const schema = {
        type: 'object',
        properties: {
            name: { type: 'string' },
            age: { type: 'string' },
            club: { type: 'string' }
        },
        required: ['name', 'age', 'club']
    }

    // validate the request
    const ajv = new Ajv();
    const valid = ajv.validate(schema, req.query);
    if(!valid) res.status(400).send(ajv.errors);

    // request is valid. Do whatever
    res.send(req.query);

})

app.listen(8080, () => console.log('Server listening on port 8080'));

Ответ на /api:

[
    {
        "keyword": "required",
        "dataPath": "",
        "schemaPath": "#/required",
        "params": {
            "missingProperty": "name"
        },
        "message": "should have required property 'name'"
    }
]

Ответ на /api?name=messi&age=10&club=barcelona:

{
    "name": "messi",
    "age": "10",
    "club": "barcelona"
}

Да, требуется немного больше кода, но, поверьте мне, это путь, если вы хотите подготовить свое приложение к сложной и масштабируемой проверке API.

1 голос
/ 07 марта 2019

Вам необходимо проверить значение каждого параметра params

If(typeof req.query.name == 'undefined' )
 { res.status(400).send('name is missing') }

Проверка для каждого значения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...