如何对 nodeJS 中的对象 id 数组进行正确验证 rest api

How to do proper validation for array of objects ids in nodeJS rest api

我目前正在努力实现 rest api build in nodeJS,mongoDB,express。其中一个字段采用对象 ID 数组(模型项目中的字段冲刺)。问题是在执行 post 方法时如何在路由文件 (projects.js) 中进行正确的验证(请记住不需要现场冲刺)?

我试图检查 typeof req.body.sprints 并对此进行 lenght,但没有结果。我也试图在 Whosebug 等上找到答案,但没有遇到任何类似的问题。

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;

在我的 post 方法中,我正在检查给定的 ID 是否存在于 table Sprint 中,但是如果没有提供 Sprint ID,我就会遇到问题(我收到 'Invalid sprint' 消息)。预期结果将是:我可以提供一组冲刺、一个冲刺或 none。

试试这个

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.object({
                    name: Joi.string(),
                    isClosed: Joi.boolean
                })
            )
        })
    };

    return Joi.validate(project, schema);
}