Scotty使用MongoDB
我对Haskell比较陌生,这是我第一次使用monad transformers。我非常感谢你的帮助Scotty使用MongoDB,mongodb,haskell,monads,monad-transformers,scotty,Mongodb,Haskell,Monads,Monad Transformers,Scotty,我对Haskell比较陌生,这是我第一次使用monad transformers。我非常感谢你的帮助 runQuery :: Pipe -> Query -> ActionM (Either Failure [Document]) runQuery pipe query = access pipe master "nutrition" (find query >>= rest) main = do pipe <- runIOE $ connect $ host
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
...
具有足够的通用性,可以在作为MonadBaseControl IO
和MonadIO
实例的任何monad中工作
例如,您可以选择IO
monad。在这种情况下,您需要liftIO。在scotty的操作中运行query
:
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
您应该在问题中包含足够的代码(包括所有导入,以及您从Hackage中使用的包的名称),以便我们可以自己尝试编译它。它使调试和测试不同解决方案变得更容易。我猜你可以在
runQuery
中用一个简单的lift
来解决这个问题,但不能测试它。我真的很感激。事实证明,我需要提升runQuery函数,并将其返回类型从ActionM(或者…
更改为IO(或者…
)。我想我现在可以在monad transformers上取得更大的进步了!如果有帮助的话,我正在经历一些非常相似的事情:将Scotty与Persistent一起使用,并试图找出如何使用transformers。这里有一些代码似乎是有效的:(忘了说:我应该使用liftIO
而不是多个lift
s…还有很多事情要做,所以请不要认为我发布的代码是合理的:我只是出于兴趣发布它)。这是一个为ActionT添加MonadBaseControl实例的请求。
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
runQuery :: Pipe -> Query -> ActionM [Document]
...
get "/" $ do
res <- runQuery pipe (select [] "stock_foods")
text $ T.pack $ show res