gpt4 book ai didi

mongodb - 如何从处理程序访问全局 MongoDB 连接?

转载 作者:可可西里 更新时间:2023-11-01 10:05:36 28 4
gpt4 key购买 nike

我正在尝试使用 Snap 制作一个简单的网络应用程序。我想要一个可以跨处理程序使用的全局 MongoDB 连接。

我在 appInit 中打开了这个连接,它起作用了。

data App = App { _mongoDB :: Pipe -- connection
}

appInit :: SnapletInit App App
appInit = makeSnaplet "site" "My Site" Nothing $ do
db <- liftIO $ do
pipe <- runIOE $ connect (host "127.0.0.1")
return pipe
return $ App db

但是,我不知道如何从处理程序访问此连接 (_mongoDB)。我尝试了几件事,包括以下内容,但每次都出现类型错误。

watchHandler :: Handler App App ()
watchHandler = do
res <- liftIO $ do
pipe <- gets _mongoDB -- type error
results <- access pipe master "db" (find $ select [] "movies")
return results

writeBS "test"

它给我以下错误:

No instance for (MonadState App IO)
arising from a use of `gets'
Possible fix: add an instance declaration for (MonadState App IO)
In a stmt of a 'do' block: pipe <- gets _mongoDB
In the second argument of `($)', namely
`do { pipe <- gets _mongoDB;
results <- access pipe master "db" (find $ select [] "movies");
return results }'
In a stmt of a 'do' block:
res <- liftIO
$ do { pipe <- gets _mongoDB;
results <- access pipe master "db" (find $ select [] "movies");
return results }

这让我很困惑。如何从处理程序访问我的 MongoDB 连接?

最佳答案

liftIO block 仅用于 IO 操作,访问应用程序状态需要在 Handler monad 本身中完成。

watchHandler :: Handler App App ()
watchHandler = do
pipe <- gets _mongoDB
res <- liftIO $ do
results <- access pipe master "db" (find $ select [] "movies")
return results

writeBS "test"

此外,绑定(bind)一个值然后立即返回它是多余的。你可以只写:

watchHandler :: Handler App App ()
watchHandler = do
pipe <- gets _mongoDB
res <- liftIO $ access pipe master "db" (find $ select [] "movies")

writeBS "test"

关于mongodb - 如何从处理程序访问全局 MongoDB 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13029740/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com