2

我正在尝试查询 MongoDB 实例以返回一个点。现在基本上是一个占位符,只是我正在尝试学习 Yesod 的基本数据类型。以下是我的处理程序路线。如何通过 id(或其他过滤器)查询数据库并将信息作为 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...
4

2 回答 2

2

returnJson期望提供一个纯值,但您提供了一个生成纯值的操作。您可以使用do-notation 吸出纯值,然后使用returnJson

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

或者,您可以使用一元绑定运算符(do-notation 只是糖):

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

这可能会揭示其他问题,但您至少应该在此步骤之后收到不同的错误消息。

于 2013-09-15T05:38:05.273 回答
0

我想到了。我使用的是脚手架设置,要添加模型,我应该把它放在 config/models 文件中。mongoSettings 是 Model.hs 文件的本地文件,而 sqlSettings 使编译器认为我试图使用 SQL 资源而不是 Mongo DB。

于 2013-09-15T23:27:43.533 回答