我有一个以 Angularjs 作为前端的 Haskell/Scotty 应用程序。它在 JSON 解析方面完美无缺。然后突然无缘无故停了下来。它发生在一些 Scotty 及其依赖项版本碰撞之后。
jsonData
解析 JSON 正文的 scotty 函数没有太多错误反馈。目前,Angular 的任何 POST 请求都不起作用。我无法弄清楚发生了什么。我不知道哪个代码示例会有用,因为任何 JSON POST 都会导致jsonData - no parse
错误。这就是我所得到的。下面是一些代码示例。
这是传递简单用户名和密码的控制器
.controller('AuthCtrl', function($scope, authS, $rootScope) {
$scope.auth = {local: false, uname: "", pass: ""};
$scope.login = function() {
authS.login($scope.auth);
}
$scope.logout = function() {
$rootScope.user.uname = "";
authS.logout();
}
这是将 POST 请求 JSON 数据发送到 Scotty 后端的服务
.factory('authS', function($http, $location, flashS, $rootScope) {
return {
login: function (d) {
$http.post("/api/login", d)
.success(function() {
$rootScope.user.uname = d.uname;
flashS.set("Login Success!", 'green');
$location.path('/home');
})
.error(function() {
flashS.set("Login Failure!", 'red', true);
});
})
这是修改后的 Scotty 路由函数,用于尝试捕获异常错误
post "/api/login" $ loginUser `rescue` \e -> do
b <- decodeUtf8 <$> body
error $ unpack $ mconcat [ "Error was: ", e, "\n"
, "Body was: ", b, "\n"
]
这是实际loginUser
功能
--------------------------------------------------------------------------------------
-- | Manage user login
loginUser :: ActionD ()
loginUser = do
j <- jsonData
error "passed the problem ..."
let h = jdataDoc j
u = at "uname" h
p = at "pass" h
l = at "local" h
a <- if l then authDB u p else liftIO $ authAD u p
if a then putInSession "uname" u else status unauthorized401
没有什么是超越j <- jsonData
界限的。
jsonData
函数崩溃,异常给了我
Error was: jsonData - no parse:
Body was:
这就是我所得到的。没有有用的错误,甚至没有要分析的身体。
如果有人有类似的问题,请帮忙。或者也许是关于可能出了什么问题的建议。正如我之前所说,在一些愚蠢的更新之前,一切都运行良好。
谢谢你。
更新
看起来我得到了一个空的身体。这就是返回 json 解析错误的原因。
将登录功能更改为此
loginUser :: ActionD ()
loginUser = do
j <- body
if not $ LBS.null j then error ("Body:" ++ (LBS.unpack j)) else error "No body"
还给我一个空的身体。
同时从 Chrome 控制台查看有效负载给了我正常的身体
标题:
POST /api/login HTTP/1.1
Host: 0.0.0.0:3000
Connection: keep-alive
Content-Length: 42
Accept: application/json, text/plain, */*
Origin: http://0.0.0.0:3000
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://0.0.0.0:3000/login
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8,ru;q=0.6,en-GB;q=0.4
Cookie: scottysid=1CVBcS09G4PKktG8XkyPHu8JjBj0FmhaltjmIprX
身体:
{"local":false,"uname":"Foo","pass":"Bar"}
响应标头:
Content-Type:text/plain; charset=utf-8
Date:Mon, 15 Sep 2014 07:40:45 GMT
Server:Warp/3.0.1.1