考虑最简单的scotty应用程序:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty

import Data.Monoid (mconcat)

main = scotty 3000 $ do
    get "/:word" $ do
        beam <- param "word"
        html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

我将此代码放入app.hs并使用GHC进行编译。我用./app运行它。简单的。
  • 人们访问该网站时会发生什么?这只是一个正在运行的./app。每当每个用户触发get "/:word" $ do行时,都会在同一个应用程序内创建一个新线程吗?可以存在多少个这样的线程?千?万?
  • 运行./app后,它显示消息Setting phasers to stun... (port 3000) (ctrl-c to quit)。但它只显示了一点。它不输出传入的Web请求。我该怎么做呢?这对于日志记录很有用。
  • 最佳答案

    假设您正在使用GHC,则对scotty服务器的每个请求实际上都会创建一个由GHC运行时调度的“绿色线程”。您可以轻松地同时运行数千个。

    Scotty本身不执行任何请求日志记录,但是由于它是基于WAI构建的,因此您可以使用为其存在的任何中间件组件,例如 RequestLogger

    {-# LANGUAGE OverloadedStrings #-}
    import Web.Scotty
    import Network.Wai.Middleware.RequestLogger
    
    import Data.Monoid (mconcat)
    
    main = scotty 3000 $ do
        middleware logStdoutDev
    
        get "/:word" $ do
            beam <- param "word"
            html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
    

    09-25 15:58