Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在NodeJSRESTAPI中正确验证对象ID数组_Node.js_Mongodb_Rest_Mongoose_Joi - Fatal编程技术网

Node.js 如何在NodeJSRESTAPI中正确验证对象ID数组

Node.js 如何在NodeJSRESTAPI中正确验证对象ID数组,node.js,mongodb,rest,mongoose,joi,Node.js,Mongodb,Rest,Mongoose,Joi,我目前正在努力在nodeJS、mongoDB和express中实现restapi构建。其中一个字段接受对象ID数组(模型项目中的字段sprint)。问题是,在使用post方法时,如何在路由文件(projects.js)中进行适当的验证(请记住,不需要字段sprint) 我试着检查要求身体冲刺的类型,并在这方面做长度,但没有结果。我还试图找到stackoverflow等问题的答案,但并没有遇到类似的问题 project.js(模型文件) projects.js(路由文件) 在我的post方法中,我

我目前正在努力在nodeJS、mongoDB和express中实现restapi构建。其中一个字段接受对象ID数组(模型项目中的字段sprint)。问题是,在使用post方法时,如何在路由文件(projects.js)中进行适当的验证(请记住,不需要字段sprint)

我试着检查要求身体冲刺的类型,并在这方面做长度,但没有结果。我还试图找到stackoverflow等问题的答案,但并没有遇到类似的问题

project.js(模型文件)

projects.js(路由文件)

在我的post方法中,我正在检查sprint表中是否存在给定的id,但如果没有提供sprint id,我就会遇到问题(我会收到“Invalid sprint”消息)。预期结果是:我可以提供一系列sprint,一个sprint,或者根本不提供任何sprint。

试试这个

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);
}

谢谢,这应该有用。我只是让它保持原样,并在应用程序的前端部分处理它,但很高兴知道它是可以做到的。
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;
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);
}