Как правильно проверить массив идентификаторов объектов в nodeJS rest api - PullRequest
0 голосов
/ 22 марта 2019

В настоящее время я пытаюсь реализовать сборку rest api в nodeJS, mongoDB, express.Одно из полей принимает массив идентификаторов объектов (спринты полей в проекте модели).Вопрос в том, как выполнить правильную проверку в файле маршрута (projects.js) при выполнении метода post (имея в виду, что спринты полей не требуются)?

Я пытался проверить typeof req.body.sprints , а также длина , но безрезультатно.Я также пытался найти ответ на stackoverflow и т. Д., Но не нашел ничего подобного.

project.js (файл модели)

const mongoose = require("mongoose");

const Project = mongoose.model(
    "Project",
    new mongoose.Schema({
        name: {
...
        sprints: [
            {
                type: new mongoose.Schema({
                    name: {
                        type: String,
                        required: true,
                        minlength: 5,
                        maxlength: 255
                    },
                    isClosed: { type: Boolean, default: false }
                })
            }
        ]
    })
);

function validateProject(project) {
    const schema = {
        name: Joi.string()
            .min(5)
            .max(255)
            .required(),
        createdBy: Joi.objectId().required(),
        isClosed: Joi.boolean(),
        sprints: Joi.array().items(Joi.objectId())
    };

    return Joi.validate(project, schema);
}

exports.Project = Project;
exports.validate = validateProject;

projects.js (файл маршрута)

const express = require("express");
const { User } = require("../models/user");
const { Sprint } = require("../models/sprint");
const { Project, validate } = require("../models/project");
const router = express.Router();

...

/* POST project */
router.post("/", async (req, res) => {
    const { error } = validate(req.body);
    if (error) return res.status(400).send(error.details[0].message);

    const user = await User.findById(req.body.createdBy);
    if (!user) return res.status(400).send("Invalid user");

    const sprint = await Sprint.findById(req.body.sprints);
    if (!sprint) return res.status(400).send("Invalid sprint");
    //i think that here i have to validate if sprint has even one 
    element and only then do object id validation

    const project = new Project({
        name: req.body.name,
        createDate: req.body.createDate,
        createdBy: { _id: user._id, name: user.name },
        isClosed: req.body.isClosed,
        sprints: [
            {
                _id: sprint._id,
                name: sprint.name,
                isClosed: sprint.isClosed
            }
        ]
    });
    await project.save();

    res.send(project);
});

...

module.exports = router;

В моем методе записи я проверяю, существует ли данный идентификатор в таблице Sprints, но у меня проблема, если не указан идентификатор спринта (я получаю 'Invalidспринт 'сообщение).Ожидаемый результат будет: я могу предоставить массив спринтов, один спринт, или ни одного вообще.

...