无法为 MongoDB.Bson.BsonObjectId 生成自动解码器

Cannot generate auto decoder for MongoDB.Bson.BsonObjectId

我正在尝试创建一个用户并将信息添加到 MongoDB。

类型看起来像这样。

[<CLIMutable>]
type User =
    { 
    Id: BsonObjectId
    Name: string
    LastName: string
    Role: string
    Email: string
    Password: string 
  }

和注册功能,

let signup : HttpHandler =
   fun (next : HttpFunc) (ctx : HttpContext) ->
       task {
            
            let! payload = ctx.BindJsonAsync<User>()
            let updated = updateUserPassword (payload, BCrypt.HashPassword(payload.Password, 10))
            try
                do! UserCollection.InsertOneAsync updated
                let maybe = UserCollection.Find(fun user -> user.Email = payload.Email).ToEnumerable() |> Seq.tryHead
                match maybe with
                | Some doc -> return! Successful.OK (userToDTO (doc)) next ctx
                | None -> return! RequestErrors.BAD_REQUEST "Invalid User" next ctx
            with :? Exception -> return! ServerErrors.INTERNAL_ERROR "Something Went Wrong" next ctx
        }

但是当我尝试创建用户时出现错误: 无法为 MongoDB.Bson.BsonObjectId

生成自动解码器

如果我将 Id 更改为 Id:string,我可以将其保存到数据库,以便连接正常工作。但是使用字符串当然不会有我想要的效果。 在哪里阅读这个post,但看不出真正的区别:( https://medium.com/@mukund.sharma92/cruding-in-f-with-mongodb-e4699d1ac17e

我正在玩的回购是 https://github.com/AngelMunoz/Giraffarig

提前致谢

看了一会儿之后,我认为解决方案是修改 signup 函数,使其像 login 函数一样工作。具体来说:

  • 在 Types.fs 中创建一个名为 SignupPayload 的类型,它类似于现有的 LoginPayload 类型。 SignupPayload 类型应包含所有 User 字段 除了 BsonObjectId.
  • 修改 signup 函数以反序列化负载。
  • 使用反序列化的负载构建并保存实际的 User 对象。

所以最终代码看起来像这样:

let! payload = ctx.BindJsonAsync<SignupPayload>()
let user = payload |> SignupPayload.toUser
let updated = updateUserPassword (user, BCrypt.HashPassword(user.Password, 10))