2013-09-15 6 views
2

Я пытаюсь запросить экземпляр MongoDB, чтобы вернуть точку. В принципе, местозаполнитель сейчас, просто базовый тип данных, поскольку я пытаюсь изучить Йесод. Ниже мой маршрут для обработчика. Как запросить базу данных по id (или некоторому другому фильтру) и вернуть информацию как JSON?Yesod Mongo DB и JSON

{-# LANGUAGE EmptyDataDecls #-} 
{-# LANGUAGE FlexibleContexts #-} 
{-# LANGUAGE GADTs    #-} 
{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE QuasiQuotes  #-} 
{-# LANGUAGE TemplateHaskell #-} 
{-# LANGUAGE TypeFamilies  #-} 
{-# LANGUAGE RecordWildCards #-} 
{-# LANGUAGE DeriveGeneric  #-} 

module Handler.Points where 

import Import 

mkPersist sqlSettings [persistLowerCase| 
Point 
    name String 
    deriving Show 
|] 

$(deriveToJSON defaultOptions ''PointGeneric) 

getPointsR :: String -> Handler Value 
getPointsR pId = do 
    pts <- runDB $ selectList [PointName ==. pId] [] 
    returnJson (pts :: [Entity Point]) 

И вот сообщение об ошибке, которое я получаю.

Handler\Points.hs:25:20: 
    Couldn't match type `Database.Persist.MongoDB.MongoBackend' 
        with `persistent-1.2.3.0:Database.Persist.Sql.Types.SqlBackend' 
    In the second argument of `($)', namely 
     `selectList [PointName ==. pId] []' 
    In a stmt of a 'do' block: 
     pts <- runDB $ selectList [PointName ==. pId] [] 
    In the expression: 
     do { pts <- runDB $ selectList [PointName ==. pId] []; 
      returnJson (pts :: [Entity Point]) } 
Build failure, pausing... 

ответ

2

returnJson рассчитывает быть обеспечено чистое значение, но вы указали действие, которое генерирует чистое значение. Вы можете использовать do -notation хлебать из чистого значения, а затем использовать returnJson:

do 
    x <- runDB $ selectFirst [ PointId ==. pId ] [] 
    returnJson x 

В качестве альтернативы можно использовать монадический оператор связывания (которые делают-нотация просто сахар для):

runDB (selectFirst [PointId ==. pId] []) >>= returnJson 

Это может показать другие проблемы, но после этого вы должны получить по крайней мере другое сообщение об ошибке.

+0

Спасибо, я внесла ваши изменения (и еще несколько на основе сообщений об ошибках, которые я получил) и обновил вопрос. Теперь это больше похоже на странную постоянную проблему с Монго. – mdietz

0

Я понял. Я использовал настройку подкладок, и для добавления модели я должен был поместить ее в файл config/models. mongoSettings является локальным для файла Model.hs, в то время как sqlSettings заставил компилятор думать, что я пытаюсь использовать ресурс SQL вместо Mongo DB.