Ich befolge dieses Tutorial http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html, um APIs über Servant zu erstellen. Ich möchte den Server so anpassen, dass er auch statische Dateien bereitstellt, aber ich konnte keinen Weg finden, dies zu tun.Serving Statische Dateien mit Servant/Wai
Ich verwende das stack
Build-Tool.
Ich änderte den Dateilauf, um static
(run port $ static $ logger $ app cfg
) zu enthalten, und ich importierte Network.Wai.Middleware.Static (static)
. Ich habe auch wai-middleware-static >=0.7.0 && < 0.71
zu meiner Cabal-Datei hinzugefügt.
Als ich (Update:. Dieser Teil total mein Fehler ist habe ich das das Paket an der falschen Clique Datei .. lahm importieren Network.Wai.Middleware.Static Werke und Aufschlägen. . statische Dateien unten für sie, falls jemand den Fehler Weggehen sucht und findet es nützlich)stack build
laufen erhalte ich:
Could not find module ‘Network.Wai.Middleware.Static’
Perhaps you meant
Network.Wai.Middleware.Gzip (from [email protected]_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Jsonp (from [email protected]_GpotceEdscHD6hq9p0wPOJ)
Network.Wai.Middleware.Local (from [email protected]_GpotceEdscHD6hq9p0wPOJ)
Next ich habe versucht, die Verwendung von Diener serveDirectory
wie folgt (vereinfacht):.
type API = "users" :> Get '[JSON] [Person]
:<|> "static" :> Raw
server = createPerson :<|> serveDirectory "/static"
ich diesen Fehler:
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
Ich bin ein Anfänger Haskell und ich bin nicht mit Wai so unsicher, wo man sogar anfangen. Welche Änderungen muss ich vornehmen, damit der Beispielcode im Blogpost statische Dateien bereitstellt?
bearbeitet: Da die Kommentare aus der Standardansicht versteckt zu bekommen, ich einfügen meinen letzten Kommentar hier ein:
Hier abgemildert wird Version von Matts code aus seinem Blog. Ich habe alle seine Module in einer einzigen Datei konsolidiert, alle Datenbank-Sachen entfernt, aber die Erweiterungen/Importe nicht bereinigt. Wenn ich diesen Code ausführe, erhalte ich den obigen Typ-Mismatch-Fehler. Bitte beachten Sie, dass dieser Code nicht Network.Wai.Middleware.Static verwendet und ich einen qualifizierten Import von Servant StaticFiles verwende.
Danke!
Für die erste, ich denke, Sie müssen Wai-App-Static zu den Build-Abhängigkeiten in Ihrer .cabal-Datei hinzufügen. –
Danke, Michael. Ich hatte das Paket eigentlich in die falsche Kabale gelegt. So funktioniert Wai-Middleware-Statik gut. Ich spiele mit dem Code im verlinkten Blogpost und habe festgestellt, dass es Middleware-Ketten gibt, also entschied ich mich für die statische Middleware. Ich werde wahrscheinlich länger brauchen, um herauszufinden, wie man 'wai-app-static' in diesem Kontext verwenden kann. – Ecognium
@Ecognium Kennen Sie [diesen Teil] (https://haskell-servant.github.io/tutorial/server.html#serving-static-files) des Servant Tutorials? –