Как отправить неверный запрос, если тело запроса неверно, используя mon goose и express - PullRequest
0 голосов
/ 01 августа 2020

модель. js

const mongoose = require('mongoose');

const appointmentSchema = new mongoose.Schema({
    name: String
});

const officeSchema = new mongoose.Schema({
    office: [appointmentSchema]
});

const Offices = mongoose.model('Offices', officeSchema);

module.exports = { Offices };

сервер. js

app.post('/offices/:id', (req, res) => {
    // Add code here
    const id = req.params.id

    const appointment = {
        name: req.body.name
    }

    Offices.findById(id).then((office => {
        if (!office) {
            res.status(404).send('Not found')
        } else {
            office.waitlist.push(appointment)
            office.save()

        }
    }))
        .catch((error) => {
            res.status(500).send('Internal Server Error') 
        })


})

Здравствуйте, я просто пытаюсь понять, как убедиться, что неверный запрос не послан. "office" - это схема офиса, это список назначений. В маршруте в server. js он найдет id некоторого офиса и вставит встречу в конец списка ожидания. Проблема в том, что если я отправлю, например,

{

    "abc": 24

}

, он все равно будет pu sh this в офисе, но проигнорирует «Ab ​​c». Я вообще не хочу, чтобы на это давили. т.е. офис будет

"office: [{_id:" someid "}]"

Я хочу, чтобы он обнаруживал неправильный ввод и возвращал статус 400

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Вы можете сделать запрос на проверку данных в разных местах:

1. Проверить в контроллере с помощью Celebrate

Celebrate - это промежуточное ПО для express с использованием Joi, для установки, запуска npm i celebrate

Затем используйте его в своем приложении, например:

const { celebrate, Joi, errors, Segments } = require('celebrate');

app.post("offices/:id", celebrate({
    [Segments.BODY]: Joi.object().keys({
        name: Joi.string().required()
}),(req, res) => {
    
    // req.body.name now isn't empty
    // do something with it

});

Если промежуточное ПО Celebrate обнаружило неверные данные, оно будет передано вашему express обработчику ошибок

2. Подтвердить на сервисном / бизнес-уровне с помощью Joi

Это очень похоже на первый вариант, но вы выполняете проверку данных на своем бизнес-уровне

Сначала установите Joi с npm i joi

Затем вы можете создать схему для проверки и использовать ее, например:

const Joi = require('joi');


const schema = Joi.object({
    name: Joi.string().required()
});

app.post("offices/:id", (req, res) => {
    
    const validatationResult = schema.validate(req.body); 

    if (validatationResult.error) {
        // error found
        console.log(validatationResult.error);
        return res.status(400).send();
    }

    // do something with req.body.name

});

Вы можете делать много других вещей с помощью Joi, например, указывать минимальную / максимальную длину, совпадать шаблон регулярного выражения, et c. Вы можете проверить do c здесь (вы также можете выполнить аналогичную проверку с помощью serverate, так как Celebrate также использует Joi)

3. Проверить в модели

Вы можете выполнить проверку данных в модели mon goose, используя Mon goose Validations , как предложено @ jcragun

Лично я предпочитаю размещать проверку данных на сервисном / бизнес-уровне или модели, потому что это имеет больше смысла.

Вы также можете проверить joi goose, что позволяет вам делать Joi проверка в схеме mon goose.

0 голосов
/ 01 августа 2020

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

Например:

const appointmentSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...