代码之家  ›  专栏  ›  技术社区  ›  Haha TTpro

如何为Haskell应用程序指定绑定端口?

  •  -2
  • Haha TTpro  · 技术社区  · 7 年前

    当我使用stack运行和应用程序时,它说

    $ stack exec duckling-example-exe
    no port specified, defaulting to port 8000
    Listening on http://0.0.0.0:8000
    

    但是,我想将端口绑定到$port(以便在heroku上托管)。

    很抱歉有新朋友的问题,但我对哈斯克尔一无所知,到目前为止还无法找到任何解决方案。

    1 回复  |  直到 7 年前
        1
  •  5
  •   epsilonhalbe    6 年前

    如果你做不到 stack exec -- duckling-example-exe --port $PORT , exe/ExampleMain.hs .

    import System.Environment (lookupEnv)
    ...
    
    main :: IO ()
    main = do
      setupLogs
      tzs <- loadTimeZoneSeries "/usr/share/zoneinfo/"
      p <- lookupEnv "PORT"
      conf <- commandLineConfig $ maybe defaultConfig (`setPort` defaultConfig)
                                                      (p >>= readMaybe)
      httpServe conf $
        ifTop (writeBS "quack!") <|>
        route
          [ ("targets", method GET targetsHandler)
          , ("parse", method POST $ parseHandler tzs)
          ]
    

    改变并不太难,因为你可以在 source code 怎样 quickHttpServe 是实现的,添加端口有点麻烦,因为 setPort :: Int -> Config m a -> Config m a Maybe Int 在这里会更方便。

    自从 lookupEnv Maybe String 我们可以用一元键 >>= readMaybe 产生 可能是内景 .

    该函数现在的工作方式如下:

    • 如果没有 PORT 已设置环境变量,并且未选择给定默认值的命令行参数
    • 如果有 --port 8080 PORT=9000 .
    推荐文章