Я следую этому руководству http://www.parsonsmatt.org/programming/2015/06/07/servant-persistent.html для создания API через servant. Я хочу настроить сервер для обслуживания статических файлов, но не могу найти способ сделать это.
Я использую инструмент сборки stack
.
Я изменил прогон Main.hs
файла, чтобы включить static
(run port $ static $ logger $ app cfg
), и импортировал Network.Wai.Middleware.Static (static)
. Я также добавил wai-middleware-static >=0.7.0 && < 0.71
в свой файл Кабала.
Когда я запускаю (Обновление: это полностью моя ошибка. Я добавил пакет не в тот файл Cabal .. lame. Импорт 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, поэтому не знаю, с чего начать. Какие изменения мне нужно внести в пример кода в сообщении в блоге для обслуживания статических файлов?
Изменить: поскольку комментарии скрываются в представлении по умолчанию, я вставляю свой последний комментарий сюда:
Вот смягченная версия кода Мэтта из его блога. Я объединил все его модули в один файл, удалил все содержимое базы данных, но не очистил расширения / импорт. Когда я запускаю этот код, я получаю указанную выше ошибку несоответствия типа. Обратите внимание, что этот код не использует Network.Wai.Middleware.Static, и я использую квалифицированный импорт Servant StaticFiles.
Спасибо!
wai-app-static
в этом контексте. - person Ecognium   schedule 24.06.2015:Raw
иserveDirectory
, и поскольку я строил поверх учебника, в котором используется Wai, я попытался использовать его напрямую. Я только что добавил:<|> "static" :> Raw
и:<|> serveDirectory "/static"
и получаю указанную выше ошибку. Возможно, мне нужно больше разобраться в настройке, чтобы понять, как интегрироваться с Wai. Я попробовалlifting
вызвать serveDirectory, но это не помогло. Я пока только догадываюсь :) - person Ecognium   schedule 25.06.2015lift
, но об этом трудно сказать, не имея возможности просмотреть весь код. - person Cactus   schedule 26.06.2015serveDirectory
. Один изNetwork.Wai.Middleware.Static
фактически переведен в надлежащий обработчик запросов, который уже будет обслуживать статические файлы в каком-то каталоге внутри servant. Только не импортируйтеNetwork.Wai.Middleware.Static
, а просто напишите serveDirectory / путь / к / вашему / статическому / каталогу. Пока вы импортируетеServant
илиServant.Utils.StaticFiles
, это будет работать. - person Alp Mestanogullari   schedule 26.06.2015Network.Wai.Middleware.Static
, и я использую квалифицированный импорт Servant StaticFiles. - person Ecognium   schedule 26.06.2015enter
преобразует ваши обработчики из одной монады в другую. Ваш сервер на основеReader
имеетRaw
для обслуживания файлов, поэтомуenter
пытается преобразовать функцию обслуживания файлов сReaderT ...
наEitherT ...
, что не сработает, потому чтоserveDirectory
не находится вReaderT
. Я не уверен, является ли это ошибкой в servant или действительно более целесообразно определить обработчик обслуживания файлов отдельно от всехReaderT
. Я уведомил других разработчиков-слуг. А пока. - person Alp Mestanogullari   schedule 27.06.2015