我正在运行Spock服务器并希望提供一些静态内容.我正在使用respondMiddleware"Web.Spock.Action"包中的函数.
签名是:
respondMiddleware :: Monad m => Middleware -> ActionCtxT ctx m a
Run Code Online (Sandbox Code Playgroud)
我使用staticPolicy"Network.Wai.Middleware.Static"软件包中的函数获取此"中间件"
staticPolicy :: Policy -> Middleware
Run Code Online (Sandbox Code Playgroud)
而"政策"则使用addBase来自"Network.Wai.Middleware.Static"的包
addBase :: String -> Policy
Run Code Online (Sandbox Code Playgroud)
这是我的代码块:
get ("/") $
respondMiddleware $ staticPolicy $ addBase ("static")
Run Code Online (Sandbox Code Playgroud)
该static有一个index.html和相关的JS和CSS文件,并将其放置在堆栈项目的根目录.我得到的错误是Failed to load resource: the server responded with a status of 400 (Bad Request)
开始使用 Haskell、Spock 和 Lucid 进行 Web 开发时,我不知道如何提供静态文件。在Main.hsI have的目录中/static/css/main.css,它只包含一个背景颜色,以查看是否确实应用了 css。所以我的目录树看起来像
app
??? Main.hs
??? static
??? css
??? main.css
Run Code Online (Sandbox Code Playgroud)
但是,使用以下配置,main.css找不到该文件(使用 Firefox 检查它时包含 404)。除此之外,该网站显示正常。
在提供这些文件(使用 Wai)时,我试图模仿funblog示例,为 Lucid 而不是 Blaze 进行了更改。特别是middleware $ staticPolicy (addBase "static")fromWeb/Blog.hs和我们链接 css from 的行Web/Views/Site.hs。
module Main where
import Network.Wai.Middleware.Static
import Lucid
import Web.Spock
import Web.Spock.Config
import Web.Spock.Lucid (lucid)
type Server a = SpockM () () () a
main :: IO ()
main = do
cfg …Run Code Online (Sandbox Code Playgroud) 我有以下函数生成1024的倍数的随机字符串:
import System.Random
rchars :: Int -> [IO Char]
rchars n = map (\_ -> randomRIO ('a', 'z')) [n | n <- [0..n]] -- a wasteful "iteration"-like func
rstr :: Int -> IO String
rstr n = sequence $ rchars (1024 * n)
Run Code Online (Sandbox Code Playgroud)
我想使用Spock将其暴露给Web,例如:
import Data.Monoid
import Data.Text
import Lib
import Web.Spock.Safe
main :: IO ()
main =
runSpock 8080 $ spockT id $
do get root $
redirect "/data/1"
get ("data" <//> var) $ \n ->
do
str <- …Run Code Online (Sandbox Code Playgroud) 我是 Haskell 的新手,老实说,我遇到了困难。但它扩展了我的想法,所以我们走了。我正在尝试运行一个非常简单的 Web 服务器,它查询 Postgres 数据库并应将结果作为 JSON 返回。
查询非常简单:“Select id,data from MYTABLE where id = 1”
但是 haskell 的类型系统现在正在杀死我,我的行为的最终类型不匹配。我使用Spock和PostgreSQL-Simple作为组合。
大多数教程对于我想要做的事情来说要么很简单,要么很困难。我介于两者之间,错过了很多对 Haskell 的理解,我之前的很多问题我已经通过简单的复制和粘贴解决了,并且得到了一个简单的版本。
但是一旦我尝试传递路由变量,我就会失败。这是我的工作版本。我的数据库表在这里称为“信封”,重要的调用是它说get "json":
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
module Main where
import Web.Spock
import Web.Spock.Config
import Database.PostgreSQL.Simple
import Data.Pool
import Data.Aeson (ToJSON(toJSON), object, (.=),Value)
import Database.PostgreSQL.Simple.FromRow
type AppAction a = SpockActionCtx () Connection AppSession AppState a
data AppState = EmptyState
data AppSession = EmptySession
data Envelope = Envelope { …Run Code Online (Sandbox Code Playgroud)