如何用 Suave 捕获像 "/COMPANY/rest..." 这样的动态子路径并嵌套路线?



我有几个必须由"公司"分组的路线,还有一些对所有有效的路线:

/login
/logout
/demo1/customers
/demo1/products

所以我尝试使用Suave:

let doReqScan action =
     warbler (fun r ->
        LOG.Debug("ROUTE: {route}", r.request.url)
        match r.request |> getCompany with
        | Some(x) ->
            let isAuth, validDb = isValidDb(x)
            if validDb then
                if isAuth then
                    action(r.request) |> _DoSet
                else
                    jSonNoAuth
            else    
                never
        | _ -> never
    )
let doReq(route:string, action) =
    path route >=> doReqScan action  
let appCompany company =
    choose [      
      path "/ws" >=> handShake ws
      GET >=>  choose
        [
          doReq("/customers", (fun r -> queryCustomers(r)))
          pathScan "/customers/%d" (fun the_id -> doReqScan (fun r -> queryCustomer(r, the_id)))
        ]
     ]
let app =
  choose
    [ allow_cors
      pathScan "/%s" (fun company ->
       choose
            [
                appCompany company
                GET >=>  choose
                  [
                    _doReq( "/config", (fun r -> config(r)) )
                  ]
                POST >=> choose
                  [
                    _doReq( "/login", (fun r -> login(r)))
                    _doReq( "/logout", (fun r -> logout(r)))
                  ]
            ]
        )
      GET >=> Files.browseHome
      jSonNotFound
    ]

但是,路径范围捕获了所有URL"/demo1/usteruster",而不仅仅是"/demo1"。

如果我正确理解:

  • 所有常见的URL均处于形式:/something
  • 所有公司URL的形式:/companyName/something

然后您可以尝试以下操作:

let appCompany company =
    let com x = "/" + company + x
    choose [      
        path (com "/ws") >=> handShake ws
        GET >=> choose [
            doReq(com "/customers", (fun r -> queryCustomers(r)))
            pathScan "/%s/customers/%d" (fun _ the_id -> doReqScan (fun r -> queryCustomer(r, the_id)))
        ]
    ]
let app =
    choose [
        allow_cors
        GET >=> choose [
                    _doReq( "/config", (fun r -> config(r)) )
                ]
        POST >=> choose [
                    _doReq( "/login", (fun r -> login(r)))
                    _doReq( "/logout", (fun r -> logout(r)))
                 ]
        pathScan "/%s/%s" (fun company _ -> appCompany company)
        GET >=> Files.browseHome
        jSonNotFound
    ]

查看长颈鹿文档中提出的内容(类似于精神上的Suave)。他们使用所有零件的路径范围 nasure subroutef

所以它会像:

pathScan "/%s/customers" queryCustomers
pathScan "/%s/products" queryProducts
...

最新更新