Ich habe einen Ajax Anruf senden Json zu einer Route in Yesod und ich möchte die Route zu analysieren, die JSON und fügen Sie es direkt in die Datenbank. In meinem Modell-Datei habe ichStandard-Zeitstempel in fromJson einfügen
createtime UTCTime default=now()
die die json verhindert wird Parsen da der Client die create Senden unten nicht. Ich habe versucht, meinen eigenen parseJson für Protokolleinträge zu schreiben, aber ich konnte keinen UTCTime-Standard einfügen, da getCurrentTime einen Wert in der IO-Monade zurückgibt. Ich möchte, dass die Datenbank den Wert nach Möglichkeit festlegt.
Die einzige Sache, an die ich an diesem Punkt denken kann, ist, einen Typ wie LogEntryWithoutTime zu machen, den JSON darin zu analysieren und in einen LogEntry zu konvertieren. Gibt es einen leichteren Weg?
Bearbeiten: Ich zeige drei verschiedene Fehler, getCurrentTime zum JSON-Parse hinzuzufügen. Zuerst besteht die Absicht darin, die createtime zu analysieren, falls verfügbar, und standardmäßig getCurrentTime auf dem Server zu verwenden. Das ist sowieso nicht richtig, da wir uns nicht auf die Zeit des Kunden verlassen sollten.
instance FromJSON Log where
parseJSON (Object o) = Log
<$> o .: "userid"
...
<*> o .:? "createtime" .!= liftIO getCurrentTime
Der Fehler ist
Model.hs:58:32:
Couldn't match expected type ‘UTCTime’
with actual type ‘m0 UTCTime’
In the second argument of ‘(.!=)’, namely ‘liftIO getCurrentTime’
In the second argument of ‘(<*>)’, namely
‘o .:? "createtime" .!= liftIO getCurrentTime’
Zweitens versuche ich die aktuelle Zeit nur zu bekommen.
<*> liftIO getCurrentTime
und erhalte ich die Fehler
Model.hs:58:9:
No instance for (MonadIO
aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser)
arising from a use of ‘liftIO’
In the second argument of ‘(<*>)’, namely ‘liftIO getCurrentTime’
Wenn ich die Linie zu
<*> getCurrentTime
dann bekomme ich
Model.hs:58:9:
Couldn't match type ‘IO’
with ‘aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser’
Expected type: aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser
UTCTime
Actual type: IO UTCTime
Haben Sie dieses Problem herausgefunden? Ich kämpfe jetzt damit. –
Entschuldigung, ich konnte keine gute Lösung finden. – user3776949