7

このチュートリアル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 ファイルに追加しました。

実行すると、次のようstack buildになります: (更新: この部分は完全に私のエラーです。パッケージを間違った cabal ファイルに追加しました..ラメ. Network.Wai.Middleware.Static のインポートは機能し、静的ファイルを提供します。場合に備えて、以下のエラーを残します誰もがそれを検索し、役に立つと思います。)

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 の限定インポートを使用していることに注意してください。

4

1 に答える 1