このチュートリアルhttp://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.htmlに従って、サーバントを介して 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)
次に、サーバント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 に慣れていないため、どこから始めればよいかわかりません。静的ファイルを提供するためにブログ投稿のサンプル コードを作成するには、どのような変更が必要ですか?
編集:コメントはデフォルトのビューから非表示になるため、最後のコメントをここに貼り付けます:
これは、Matt のブログのコードのトーンダウン バージョンです。彼のすべてのモジュールを単一のファイルに統合し、すべてのデータベースのものを削除しましたが、拡張機能/インポートをクリーンアップしませんでした. このコードを実行すると、上記のタイプの不一致エラーが発生します。このコードは Network.Wai.Middleware.Static を使用せず、Servant StaticFiles の限定インポートを使用していることに注意してください。