长颈鹿 routef 异步函数
giraffe routef async function
我一直在使用 f# 创建 Giraffe api 服务器,并且很高兴地使用了 route
函数:
type Person = { id: BsonObjectId; name: string; age: int; }
let getPeople (databaseFn: unit-> IMongoDatabase) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let! cursor = collection.FindAsync<Person>(fun p -> true)
let! hasMoved = cursor.MoveNextAsync()
let result =
match hasMoved with
| true -> json cursor.Current next ctx
| false ->
let message = { message = "No People found" }
RequestErrors.notFound (json message) next ctx
return! result
}
let savePerson (databaseFn: unit -> IMongoDatabase ) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let serialiser = ctx.GetJsonSerializer()
let! person = ctx.BindJsonAsync<Person>()
let personWithId = { person with id = BsonObjectId ( ObjectId.GenerateNewId() ) }
do! collection.InsertOneAsync(personWithId)
return! text "nailed it" next ctx
}
let deletePerson (databaseFn: unit -> IMongoDatabase ) =
fun (id: string) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let oId = BsonObjectId (ObjectId id)
let! result = collection.FindOneAndDeleteAsync<Person>(fun p -> p.id = oId)
return text "awesomesauce"
}
let personHandler getPeople savePerson deletePerson =
let path = "/people"
choose [
GET >=> choose [
route path >=> getPeople
]
POST >=> choose [
route path >=> savePerson
]
DELETE >=> choose [
routef "/people/%s" >=> deletePerson
]
]
但我添加了 deletePerson
处理程序,但它现在抱怨
routef "/people/%s" >=> deletePerson
The type 'HttpFuncResult' does not match the type 'HttpHandler'
我知道类型不匹配,但是当我这样使用它时
routef "/people/%s" deletePerson
它抱怨 deletePerson
函数 returns System.Threading.Tasks.Task<(HttpFunc -> HttpContext -> HttpFuncResult)>
而不是 HttpHandler
我只是不确定我如何拥有 routef
我可以从路由参数中获取值并一次性拥有一个异步 HttpHandler?
我没有导入所有类型来编译整个东西,但我认为你需要从 delete:
中删除 >=>
DELETE >=> choose [
(routef "/people/%s" deletePerson)
]
deletePerson 签名为:
let deletePerson (databaseFn: unit -> IMongoDatabase ) (id: string) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
//etc
我一直在使用 f# 创建 Giraffe api 服务器,并且很高兴地使用了 route
函数:
type Person = { id: BsonObjectId; name: string; age: int; }
let getPeople (databaseFn: unit-> IMongoDatabase) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let! cursor = collection.FindAsync<Person>(fun p -> true)
let! hasMoved = cursor.MoveNextAsync()
let result =
match hasMoved with
| true -> json cursor.Current next ctx
| false ->
let message = { message = "No People found" }
RequestErrors.notFound (json message) next ctx
return! result
}
let savePerson (databaseFn: unit -> IMongoDatabase ) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let serialiser = ctx.GetJsonSerializer()
let! person = ctx.BindJsonAsync<Person>()
let personWithId = { person with id = BsonObjectId ( ObjectId.GenerateNewId() ) }
do! collection.InsertOneAsync(personWithId)
return! text "nailed it" next ctx
}
let deletePerson (databaseFn: unit -> IMongoDatabase ) =
fun (id: string) ->
let database = databaseFn()
let collection = database.GetCollection<Person> "people"
task {
let oId = BsonObjectId (ObjectId id)
let! result = collection.FindOneAndDeleteAsync<Person>(fun p -> p.id = oId)
return text "awesomesauce"
}
let personHandler getPeople savePerson deletePerson =
let path = "/people"
choose [
GET >=> choose [
route path >=> getPeople
]
POST >=> choose [
route path >=> savePerson
]
DELETE >=> choose [
routef "/people/%s" >=> deletePerson
]
]
但我添加了 deletePerson
处理程序,但它现在抱怨
routef "/people/%s" >=> deletePerson
The type 'HttpFuncResult' does not match the type 'HttpHandler'
我知道类型不匹配,但是当我这样使用它时
routef "/people/%s" deletePerson
它抱怨 deletePerson
函数 returns System.Threading.Tasks.Task<(HttpFunc -> HttpContext -> HttpFuncResult)>
而不是 HttpHandler
我只是不确定我如何拥有 routef
我可以从路由参数中获取值并一次性拥有一个异步 HttpHandler?
我没有导入所有类型来编译整个东西,但我认为你需要从 delete:
中删除>=>
DELETE >=> choose [
(routef "/people/%s" deletePerson)
]
deletePerson 签名为:
let deletePerson (databaseFn: unit -> IMongoDatabase ) (id: string) : HttpHandler =
fun (next : HttpFunc) (ctx : HttpContext) ->
let database = databaseFn()
//etc