2016-03-07 39 views
0

我一直在使用this guide來爲我的項目添加身份驗證和授權。我是新來耶索德並已運行到一些問題:使用Haskell向現有的Yesod項目添加身份驗證

我使用下面的基礎數據:

data App = App (TChan Text)

對於我認證,我需要這個數據類型:

data App = App SqlBackend

我怎麼能結合這兩個?那麼我還必須改變現有的功能?

我到底運行一切是這樣的:

main :: IO() 
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do 
    runSqlConn (runMigration migrateAll) conn 
    chan <- newTChanIO 
    warp 3000 $ App chan 
-- Backend SqlBackend needs to be initilized with conn (see below) 


{- OLD 
main = do 
    chan <- newTChanIO 
    warp 3000 $ App chan 
-} 

{- NEW 
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do 
    runSqlConn (runMigration migrateAll) conn 
    warp 3000 $ App conn 
-} 

我知道,我必須把兩者結合起來。我讀了this article。我如何獲得chanconn?這可能聽起來微不足道,但幾乎沒有文檔。

請幫幫我!

回答

2

通常,人們使用App數據類型創建具有多個字段的記錄。例如,scaffolded Yesod project使用此代碼:

data App = App 
    { appSettings :: AppSettings 
    , appStatic  :: Static --^Settings for static file serving. 
    , appConnPool :: ConnectionPool --^Database connection pool. 
    , appHttpManager :: Manager 
    , appLogger  :: Logger 
    } 

example code您鏈接到這是否還有:

data App = App 
    { homepageContent :: Html 
    , visitorCount :: IORef Int 
    } 

所以大約是這樣的:

-- Small caveat: this is code untested 
data App = App 
     { backend :: SqlBackend 
     , chan :: TChan Text 
     } 

main :: IO() 
main = do 
    chan <- newTChanIO 
    runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do 
     runSqlConn (runMigration migrateAll) conn 
     warp 3000 $ App { backend=conn, chan=chan} 

你將不得不要更改訪問您的TChan的舊代碼,但是一旦您的應用程序是記錄,您可以添加更多字段,而無需更改其他代碼庫。

作爲一個方面說明,你有沒有考慮過使用Yesod scaffolding?您將開始爲您處理所有這些事情,併爲您提供一系列其他細節和最佳實踐。

+0

它的工作原理。你是最棒的! – Spacemoose

+1

酷,很高興它爲你工作:) – MaxGabriel

相關問題