Suave 和 DotLiquid
Suave and DotLiquid
为清楚起见进行了编辑
不知何故这有效:
path "/" >=> warbler (fun _ -> OK (string DateTime.Now))
但这个不是:
let txnAccA =
let sqlStr = "select JSON from Store.Txn"
let result = Db.execute sqlStr Config.oConnStr
match result with
| Some a ->
[for i in a do
let msg = JsonConvert.DeserializeObject<TxnAccA>(i)
yield msg
]
| _ ->
List.empty<TxnAccA>
let txnAmtA =
let sqlStr = "select JSON from Store.Amt"
let result = Db.execute sqlStr Config.oConnStr
match result with
| Some a ->
[for i in a do
let msg = JsonConvert.DeserializeObject<TxnAmtA>(i)
yield msg
]
| _ ->
List.empty<TxnAmtA>
let result ()= {Acc= txnAccA; Amt= txnAmtA}
path "/txn" >=> warbler (fun _ -> page "txn.html" (result()))
"works" 我的意思是页面不是静态的,它显示数据库中的最新数据。知道为什么吗?
txnAccA
和 txnAmtA
需要是函数(类似于 result
)。它们现在被定义为值,因此被分配一次并且不会为每个请求查询数据库。 result
每次调用时都会创建一条新记录,但值始终保持不变。
let txnAccA () = //...
let txnAmtA () = //...
let result () = { Acc = txnAccA(); Amt = txnAmtA() }
path "/txn" >=> warbler (fun _ -> page "txn.html" (result()))
为清楚起见进行了编辑
不知何故这有效:
path "/" >=> warbler (fun _ -> OK (string DateTime.Now))
但这个不是:
let txnAccA =
let sqlStr = "select JSON from Store.Txn"
let result = Db.execute sqlStr Config.oConnStr
match result with
| Some a ->
[for i in a do
let msg = JsonConvert.DeserializeObject<TxnAccA>(i)
yield msg
]
| _ ->
List.empty<TxnAccA>
let txnAmtA =
let sqlStr = "select JSON from Store.Amt"
let result = Db.execute sqlStr Config.oConnStr
match result with
| Some a ->
[for i in a do
let msg = JsonConvert.DeserializeObject<TxnAmtA>(i)
yield msg
]
| _ ->
List.empty<TxnAmtA>
let result ()= {Acc= txnAccA; Amt= txnAmtA}
path "/txn" >=> warbler (fun _ -> page "txn.html" (result()))
"works" 我的意思是页面不是静态的,它显示数据库中的最新数据。知道为什么吗?
txnAccA
和 txnAmtA
需要是函数(类似于 result
)。它们现在被定义为值,因此被分配一次并且不会为每个请求查询数据库。 result
每次调用时都会创建一条新记录,但值始终保持不变。
let txnAccA () = //...
let txnAmtA () = //...
let result () = { Acc = txnAccA(); Amt = txnAmtA() }
path "/txn" >=> warbler (fun _ -> page "txn.html" (result()))