角度$ http.post的CORS问题 - 成功请求导致状态为0

时间:2015-12-28 15:15:05

标签: angularjs http cors

我正在使用angular来POST到身份验证端点;在服务器端,我可以看到请求成功,并设置了正确的CORS头。 Angular的起源是http://localhost:9000

在服务器端,预检OPTIONS请求总是返回200,所以看起来没问题。

在客户端,$http.post总是失败,错误代码为0,其他研究表明CORS仍然存在问题。我已阅读规范并尝试了其他一些答案,但仍然缺少某些内容。

Angular POST就像这样:

    $http({
        method: 'POST',
        url: 'http://localhost:3000/auth/login',
        data: {
            username: $scope.username,
            password: $scope.password
        }
    })
    .then(function (response) {
         /* etc. etc. */
    }, function (response) {
        /* This always triggers, with response.status = 0 */
        console.log("ERROR: " + response.data);
        console.log("Status: " + response.status);
        console.log("Status text: " + response.statusText);
        console.log("Headers: " + response.headers);

        $scope.error = 'Something went wrong...';
    });

使用curl调试服务器发回的内容,就是这样:

< HTTP/1.1 302 Found
< X-Powered-By: Express
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS
< Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, Content-Length, X-Requested-With
< Access-Control-Allow-Credentials: true
< Set-Cookie: ua_session_token=(blahblah); Path=/
< Location: /
< Vary: Accept
< Content-Type: text/plain; charset=utf-8
< Content-Length: 23
< Date: Mon, 28 Dec 2015 15:08:17 GMT
< Connection: keep-alive

这就是为什么我不知道,按照规范,服务器似乎正在做正确的事情?

以下是服务器在请求标头方面从客户端获取的内容:

HEADER host localhost:3000
HEADER content-type application/json;charset=UTF-8
HEADER origin http://localhost:9000
HEADER content-length 38
HEADER connection keep-alive
HEADER accept application/json, text/plain, */*
HEADER user-agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
HEADER referer http://localhost:9000/
HEADER accept-language en-us
HEADER accept-encoding gzip, deflate

UPDATE 根据this post尝试了其他没有运气的事情。看起来Access-Control-Allow-Headers区分大小写,并且角度正在请求accept, origin, content-type上发送。我调整了服务器以鹦鹉回来,没有运气。

1 个答案:

答案 0 :(得分:1)

好吧,将我的头戴在键盘上几个小时之后,我已经修好了。

答案似乎是,角度确实不像是为了回复POST而获得重定向。当我更改服务器端点以仅返回一个普通的身份验证令牌作为文本时(无论如何它都设置为cookie)而不是返回重定向,角度POST开始像魅力一样工作并且落到了成功经纪人。

不确定我是否已深入了解这一点,以了解为什么角度以这种方式表现;通过玩弄它我发现,如果服务器发送的重定向是一个不存在的(404)URL,可以复制,即使,原始POST返回该有效重定向。