我遇到了一个我无法解决的小问题。 Yesod与postgres模板。
我的目标是创建一个以当前uid命名的新目录。
-- model
-- User
ident Text
-- ...
-- Handler
uploadDirectory :: FilePath
uploadDirectory = "static/docs"
writeToServer :: FileInfo -> Handler FilePath
writeToServer file = do
let filename = unpack $ fileName file
filepath = registerFilePath filename
liftIO $ fileMove file filepath
return filename
registerFilePath :: String -> FilePath
registerFilePath f = do
(_,muser) <- requireAuthPair
uploadDirectory </> showText (userIdent muser) </> f
我得到:
*"Couldn't match type ‘AuthEntity (HandlerSite [])’ with ‘User’
Expected type: [(AuthId (HandlerSite []), User)]
Actual type: [(AuthId (HandlerSite []), AuthEntity (HandlerSite []))]"*
似乎调用userIdent要求muser的类型为“用户”。 但是requireAuthPair返回AuthEntity(HandlerSite [])。
我猜未针对这种情况定义requireAuthPair。有帮助吗?
您忠实的 费利佩·阿尔戈洛
PS:我没有更改postgres模板身份验证设置。 我首先要进行伪认证测试
答案 0 :(得分:1)
特别关注:
registerFilePath :: String -> FilePath
registerFilePath f = do
(_,muser) <- requireAuthPair
uploadDirectory </> showText (userIdent muser) </> f
此类型的签名看起来不正确。您说的是返回的是 pure FilePath
值,但实际上应该将其包装成某种单子类型,例如String -> Handler FilePath
。您还可能需要在return $
之前添加uploadDirectory
。