AngularJS:无法使用适当的CORS头发送POST请求

时间:2014-06-06 13:42:51

标签: javascript jquery node.js angularjs cors

我正在使用 AngularJS 创建一个网络应用。为了测试它,我使用angular-seed template NodeJS服务器中运行应用。

在这个应用程序中,我需要通过POST请求向另一台主机发送JSON消息,并获得响应,因此,我正在使用CORS

我的请求是通过实现使用AngularJS http service的服务来完成的(我需要$ http提供的抽象级别。所以,我不使用$resource)。

在这里,我的代码。请注意我修改$ httpProvider以告诉AngularJS使用适当的CORS标头发送其请求

angular.module('myapp.services', []).

  // Enable AngularJS to send its requests with the appropriate CORS headers
  // globally for the whole app:
  config(['$httpProvider', function($httpProvider) {
          $httpProvider.defaults.useXDomain = true;

          /**
           * Just setting useXDomain to true is not enough. AJAX request are also
           * send with the X-Requested-With header, which indicate them as being
           * AJAX. Removing the header is necessary, so the server is not
           * rejecting the incoming request.
           **/
          delete $httpProvider.defaults.headers.common['X-Requested-With'];
      }
  ]).

  factory('myService', function($http) {
    return {
      getResponse: function() {
        var exampleCommand = JSON.stringify({"foo": "bar"});

        // This really doesn't make a difference
        /*
        var config = {headers: {
            'Access-Control-Allow-Origin':'*',
            'Access-Control-Allow-Headers': 'Content-Type, Content-Length, Accept',
            'Content-Type': 'application/json'
          }
        };
        */

        //return $http.post(REMOTE_HOST, exampleCommand, config).
        return $http.post(REMOTE_HOST, exampleCommand).
          success(function(data, status, headers, config) {
              console.log(data);
              return data;
          }).
          error(function (data, status, headers, config) {
            return {'error': status};
          });
      }
    }
  });

问题是我无法使其发挥作用。我总是收到错误消息

  

阻止跨源请求:同源策略禁止读取   REMOTE_HOST上的远程资源。这可以通过移动来修复   资源到同一个域或启用CORS。

但是,如果我这样做一个简单的jQuery AJAX调用:

$.ajax(REMOTE_HOST,
{
    dataType: "json",
    type: "POST",
    data: exampleCommand,
    success: function(data) { console.log(data); },
    error: function(request, textStatus, errorThrown) { console.log("error " + textStatus + ": " + errorThrown);}
 });

工作正常。

所以,我的问题:

- 如何在NodeJS下运行的AngularJS中允许跨站点请求?

更新:感谢Dayan Moreno Leon的回应。

我的问题是我需要add cors support to my server。我使用NodeJS http-server进行开发,使用 lighttpd 进行制作。

- 为什么简单的jQuery POST请求有效,但AngularJS POST请求没有?

我猜jQuery AJAX请求默认为cross-domain。还不太确定。

非常感谢提前

2 个答案:

答案 0 :(得分:4)

CORS不在客户端上处理,但在服务器中,您需要在您的angular应用程序尝试POST的nodejs应用程序上允许CORS。如果您使用快递

,可以尝试使用cors模块

https://www.npmjs.org/package/cors

另外,您需要检查选项方法并返回200作为回复

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

答案 1 :(得分:3)

  

为什么简单的jQuery POST请求有效,但AngularJS POST请求没有?

jQuery使用simple requests而AngularJS使用preflighted requests

在角度代码中,您可以将Content-Type设置为application/x-www-form-urlencoded并使用$.param

对数据进行编码