簡體   English   中英

如何修復通過 SqlDataProvider 從 DB 獲取的 Giraffe API 返回的空對象

[英]How to fix empty objects returned by Giraffe API fetched from DB through SqlDataProvider

我正在嘗試通過創建一個帶有存儲庫的 F# 應用程序來學習 F# 應用程序,以便為未來的健身房應用程序獲取練習。

我使用 SqlServer 存儲數據並使用 Fsharp.Data.Sql 獲取數據。 對此的單元測試運行良好。

我正在嘗試使用 Giraffe 通過 web api 公開數據,問題是我得到了一個長度正確但里面有空對象的列表。

這是上下文:

module Context

open FSharp.Data.Sql

let [<Literal>] dbVendor = Common.DatabaseProviderTypes.MSSQLSERVER
let [<Literal>] connectionString = "Server=DESKTOP-20JMHNK;Database=GymStrongDB;Trusted_Connection=True;"
let [<Literal>] indivAmount = 1000
let [<Literal>] useOptTypes  = true
let [<Literal>] owner = "public, admin, references"

type sql =
    SqlDataProvider<
        dbVendor,
        connectionString,
        "",
        "",
        indivAmount,
        useOptTypes,
        owner>

let gymStrongContext = sql.GetDataContext()

這是存儲庫

namespace GymStrong.Repositories

open ...

module ExerciseRepository =
    let ctx = gymStrongContext.Dbo

    let getExercises = 
        ctx.Exercises |> Seq.toList

    let getExercisesHandler : HttpHandler =
        fun (next : HttpFunc) (ctx : HttpContext) ->
            Successful.OK getExercises next ctx

這是 Program.fs 的相關部分

open ...

let webApp =
    choose [
        GET >=> 
            choose [
                route "/" >=> text "Hello World"
                route "/user" >=> mustBeLoggedIn >=> getLoggedInUser
                route "/logout" >=> mustBeLoggedIn >=> logoutHandler
                route "/exercises" >=> mustBeLoggedIn >=> getExercisesHandler
                ]
        POST >=> 
            choose [
                route "/register" >=> registerHandler
                route "/login" >=> loginHandler
            ]
    ]

在單元測試中,這可以正常工作。 單元測試用 C# 編寫。

當我通過 PostMan 消費 API 時,我得到了這個響應

[{},{}]

哪個長度正確,因為我在數據庫中有兩個練習,但對象似乎是空的。

這可能對某人有用,所以我會發布它。

Giraffe 和 SqlDataProvider 都在做他們應該做的事情。 問題是我認為我可以在 API 中將提供的類型作為 json 響應傳遞。 這是錯誤的,因為提供的類型不是真正的類型並且被“擦除”(而不是 Generated ,這是我認為我正在使用的類型)。

為了解決這個問題,我需要將 map 的值輸出到“真正的”貧血 DTO object 並將其作為響應傳遞。 現在我需要弄清楚是否可以根據 entityTypes 提供這些貧血的 DTO 對象,並讓它們從其他程序集中生成和使用。

附加代碼:

在存儲庫/服務中

    type exerciseDto = { 
        Id : string;
        Name : string;
        Description : string;
        Owner : string;
        Type : int; 
    }

    let getExercises = 
        ctx.Exercises |> Seq.map(fun exercise -> exercise.MapTo<exerciseDto>()) |> Seq.toList

在 program.cs 中

let handlerWrapper action : HttpHandler =
    fun (next : HttpFunc) (ctxHttp : HttpContext) ->
        Successful.OK action next ctxHttp

let webApp =
    choose [
        GET >=> 
            choose [
                route "/" >=> text "Hello World"
                route "/user" >=> mustBeLoggedIn >=> getLoggedInUser
                route "/logout" >=> mustBeLoggedIn >=> logoutHandler
                route "/exercises" >=> mustBeLoggedIn >=> handlerWrapper getExercises
                ]
        POST >=> 
            choose [
                route "/register" >=> registerHandler
                route "/login" >=> loginHandler
            ]
    ]

希望這可以幫助任何人在未來節省時間。 我至少花了幾個小時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM