Golang mongodb驱动程序错误架构验证

slwdgvem  于 2023-03-07  发布在  Go
关注(0)|答案(3)|浏览(146)

我正在用golang和mongodb official driver编写一个小的REST API,我被mongodb的错误验证卡住了。
让我解释一下:

    • 我的验证架构(简化)**
var jsonSchema = bson.M{
    "bsonType":             "object",
    "required":             []string{"lastname"},
    "additionalProperties": false,
    "properties": bson.M{
        "lastname": bson.M{
            "bsonType":    "string",
            "description": "must be a string and is required",
        },
    },
}

var validator = bson.M{
    "$jsonSchema": jsonSchema,
}

// Migrate create users collection with validation schema
func (r *Repo) Migrate() error {

    opts := options.CreateCollection().SetValidator(validator)

    if err := r.db.CreateCollection(r.ctx, "users", opts); err != nil {
        return err
    }

    return nil
}

因此,在我的验证模式中,我需要用户的姓氏,并给它一个描述来处理它的错误(我从文档中了解到这一点)
但是使用我的创建用户函数:

// Create user to repo
func (r *Repo) Create(usr *User) {
    if r.err != nil {
        return
    }
    u := r.db.Collection("users")
    _, err := u.InsertOne(r.ctx, usr)
    if err != nil {
        we, ok := err.(mongo.WriteException)
        if ok {
            fmt.Println(we)

            for _, r := range we.WriteErrors {
                fmt.Println(r)
            }

        }
        r.err = fmt.Errorf("error occured during creating. got=%w", err)
        return
    }
}

我的用户结构

// User structure representation
type User struct {
    ID        primitive.ObjectID `bson:"_id"`
    Lastname  string             `bson:"lastname"`
}

来自post http请求的我的json主体

{
  "something": "xxxx"
}

预期错误:类似于(例如,我预期的错误):

{
    "field": "lastname",
    "message": "must be a string and is required"
}

我从我的错误中得到:multiple write errors: [{write errors: [{Document failed validation}]}, {<nil>}]
从我对WriteException的错误强制转换中:Document failed validation
我读了文档description N/A string A string that describes the schema and has no effect.,但对验证没有影响,或者它只是对读架构的人的注解?
我想有我的描述我的错误显示到我的http resp!也许我是在错误的方式来管理它,所以我可以重写它!
感谢阅读我,希望有人能帮助我:)祝你有美好的一天

bjp0bcyl

bjp0bcyl1#

目前(MongoDB v4.4)MongoDB服务器没有返回文档验证失败的原因。有一个未决问题SERVER-20547来跟踪此工作。请随时观看或投票票来接收进度更新。
您应该实现应用程序级输入验证。确保在插入数据库之前输入的数据类型正确。

8nuwlpux

8nuwlpux2#

您需要在属性中声明id字段,因为additionalProperties属性被设置为false。Mongodb自动将**_id字段注入到将要插入到集合中的文档中,以提高数据处理性能。
下面是添加到
_id**属性的方案示例:

var jsonSchema = bson.M{
    "bsonType":             "object",
    "required":             []string{"lastname"},
    "additionalProperties": false,
    "properties": bson.M{
        "_id": bson.M{
            "bsonType": "objectId",
        },
        "lastname": bson.M{
            "bsonType":    "string",
            "description": "must be a string and is required",
        },
    },
}

相关问题