【问题标题】:How to do proper validation for array of objects ids in nodeJS rest api如何正确验证nodeJS rest api中的对象ID数组
【发布时间】:2019-08-13 20:47:26
【问题描述】:

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

我试图检查 typeof req.body.sprints 并对此进行 lenght,但没有结果。我也试图在 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;

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

【问题讨论】:

    标签: node.js mongodb rest mongoose joi


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 谢谢,这应该可以。我只是保持原样并在应用程序的前端部分处理它,但很高兴知道它可以完成。
    猜你喜欢
    • 2018-08-21
    • 2019-06-22
    • 2020-08-28
    • 2013-10-22
    • 2012-09-17
    • 2017-03-05
    • 2021-07-14
    • 2021-02-18
    • 2014-03-06
    相关资源
    最近更新 更多