无法为 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))
我正在尝试创建一个用户并将信息添加到 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))