我正在按照本教程http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html通过servant 创建API。我想自定义服务器以提供静态文件,但找不到方法。
我正在使用stack
构建工具。
我修改了Main.hs
文件的运行以包含static
( run port $ static $ logger $ app cfg
) 并导入了Network.Wai.Middleware.Static (static)
. 我还添加wai-middleware-static >=0.7.0 && < 0.71
到了我的 cabal 文件中。
当我运行时,更新:这部分完全是我的错误。我将包添加到错误的 cabal 文件中.. 蹩脚。导入 Network.Wai.Middleware.Static 工作并提供静态文件。留下下面的错误以防万一任何人搜索它并发现它很有用。)stack build
我得到:(
Could not find module ‘Network.Wai.Middleware.Static’
Perhaps you meant
Network.Wai.Middleware.Gzip (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Jsonp (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Local (from wai-extra-3.0.7.1@waiex_GpotceEdscHD6hq9p0wPOJ)
接下来我尝试使用servant的serveDirectory
如下(简化):
type API = "users" :> Get '[JSON] [Person]
:<|> "static" :> Raw
server = createPerson :<|> serveDirectory "/static"
我收到此错误:
Couldn't match type ‘IO’ with ‘EitherT ServantErr IO’
arising from a functional dependency between:
constraint ‘Servant.Server.Internal.Enter.Enter
(IO Network.Wai.Internal.ResponseReceived)
(AppM :~> EitherT ServantErr IO)
(IO Network.Wai.Internal.ResponseReceived)’
arising from a use of ‘enter’
instance ‘Servant.Server.Internal.Enter.Enter
(m a) (m :~> n) (n a)’
at <no location info>
In the expression: enter (readerToEither cfg) server
In an equation for ‘readerServer’:
readerServer cfg = enter (readerToEither cfg) server
我是 Haskell 初学者,我对 Wai 不熟悉,所以甚至不确定从哪里开始。我需要对博客文章中的示例代码进行哪些更改才能提供静态文件?
编辑:由于评论从默认视图中隐藏,我将我的最后一条评论粘贴在这里:
这是他博客中马特代码的低调版本。我将他的所有模块合并到一个文件中,删除了所有数据库内容,但没有清理扩展/导入。当我运行此代码时,我收到上述类型不匹配错误。请注意,此代码不使用 Network.Wai.Middleware.Static,而我使用的是符合条件的 Servant StaticFiles 导入。