【问题标题】:How do I use wai-handler-devel with a simple wai application如何在一个简单的 wai 应用程序中使用 wai-handler-devel
【发布时间】:2015-04-16 18:33:11
【问题描述】:

我有使用 wai 的基本“hello world”应用程序设置,并想使用 wai-handler-devel,但我不确定如何去做,也找不到在 wai 项目中使用它的任何示例.

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.HTTP.Types
import Network.Wai.Handler.Warp (run)
import Data.ByteString.Lazy.Char8 () -- Just for an orphan instance

app :: Application
app _ = return $ responseLBS
    status200
    [("Content-Type", "text/plain")]
    "Hello, World!"

main :: IO ()
main = do
    putStrLn $ "http://localhost:8080/"
    run 8080 app

我需要做什么才能让 wai-handler-devel 使用基本的 wai 应用程序?

注意: 如果您遇到“wai-handler-devel: command not found”的问题,这里有一个修复(https://gist.github.com/1499226

【问题讨论】:

    标签: haskell yesod haskell-wai


    【解决方案1】:

    wai-handler-devel 的 Hackage page 说应该像这样从命令行调用它:

    $ wai-handler-devel <port> My.App.Module myApp
    

    并且您的应用程序的类型必须如下所示:

    myApp :: (Application -> IO ()) -> IO ()
    

    在这种情况下,您应该如下定义myApp

    myApp :: (Application -> IO ()) -> IO ()
    myApp handler = handler app
    

    虽然您可能想完全内联app

    myApp :: (Application -> IO ()) -> IO ()
    myApp handler = handler $ \_ -> return $ responseLBS
        status200
        [("Content-Type", "text/plain")]
        "Hello, World!"
    

    类型是这样的,以便您可以在IO中进行启动时的初始化等。我建议阅读 wai-handler-devel 的 git 存储库中的 SmallAppFullApp 示例;后者特别有用,因为它的调试输出显示了重新加载期间的代码流,并显示了如何集成长时间运行的数据库连接。

    FullApp 示例的 run script 还展示了如何以编程方式使用 wai-handler-devel,包括手动指定 Hamlet 模板依赖项(wai-handler-devel 命令行工具 determines automatically)。

    然后您应该能够重写您的main,如下所示:

    main :: IO ()
    main = do
        putStrLn $ "http://localhost:8080/"
        myApp (run 8080)
    

    当然,您也可以轻松地从wai-handler-fastcgiwai-handler-scgi 甚至wai-handler-webkit 传递run 函数。

    【讨论】:

    • 从命令行运行 wai-handler-devel 时遇到“wai-handler-devel: command not found”错误。
    • 我在周末升级了 Haskell,我想知道这是否破坏了命令。很奇怪。
    • 试试~/.cabal/bin/wai-handler-devel——如果可行,那么您需要将$HOME/.cabal/bin 添加到您的$PATH。否则,您可能想再次尝试cabal installing。
    • 好的。我根本没有 ~/.cabal/bin。我可能会重新安装 Haskell 并重新开始。
    • 在 $HOME/Library/Haskell/bin 中找到它并添加到路径中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多