首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scotty使用MongoDB

Scotty使用MongoDB
EN

Stack Overflow用户
提问于 2014-05-08 09:59:23
回答 1查看 1.1K关注 0票数 4

我对Haskell比较陌生,这是我第一次使用monad transformers。如果能帮上忙我会很感激的。

代码语言:javascript
复制
runQuery :: Pipe -> Query -> ActionM (Either Failure [Document])
runQuery pipe query = access pipe master "nutrition" (find query >>= rest) 

main = do
pipe <- runIOE $ connect $ host "127.0.0.1"  

scotty 3000 $ do
post "/" $ do
        b <-  body
        let user :: Either String User = eitherDecode b
        case user of 
            Left err -> text . pack $ "Could not decode the user:" ++ err ++ ":\n" ++ (show b)
            Right u -> do 
            let query::Query = (select ["i_name" =: ["$in" =: map (unpack . name) (foods u)]] "stock_foods")
            results <- runQuery pipe query  
            ...

我正在尝试查询scotty web框架下的mongodb数据库,但是我得到了一个关于MonadBaseControl的错误。我真的需要创建一个这样的实例才能用scotty连接到数据库吗?我该怎么做呢?

代码语言:javascript
复制
No instance for (MonadBaseControl
                   IO (scotty-0.7.2:Web.Scotty.Types.ActionT Text IO))
  arising from a use of `find'
Possible fix:
  add an instance declaration for
  (MonadBaseControl
     IO (scotty-0.7.2:Web.Scotty.Types.ActionT Text IO))
EN

回答 1

Stack Overflow用户

发布于 2014-10-13 15:58:05

mongoDB足够通用,可以在作为MonadBaseControl IOMonadIO实例的任何monad中工作。

例如,您可以选择IO monad。在这种情况下,您需要在scotty的操作中使用liftIO . runQuery

代码语言:javascript
复制
import Web.Scotty
import Database.MongoDB
import qualified Data.Text.Lazy as T
import Control.Monad.IO.Class

runQuery :: Pipe -> Query -> IO [Document]
runQuery pipe query = access pipe master "nutrition" (find query >>= rest) 

main = do
  pipe <- connect $ host "127.0.0.1"
  scotty 3000 $ do
    get "/" $ do
      res <- liftIO $ runQuery pipe (select [] "stock_foods")
      text $ T.pack $ show res

@Sebastian Philipp added MonadBaseControl Scotty.ActionT实例之后,不需要抬起任何东西。你可以透明地使用mongoDB form scotty。只需更改类型签名并删除liftIO

代码语言:javascript
复制
runQuery :: Pipe -> Query -> ActionM [Document]
...
    get "/" $ do
      res <- runQuery pipe (select [] "stock_foods")
      text $ T.pack $ show res
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23531465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档