Javascript AngularJS:无法发送带有适当CORS标题的POST请求

Javascript AngularJS:无法发送带有适当CORS标题的POST请求,javascript,jquery,node.js,angularjs,cors,Javascript,Jquery,Node.js,Angularjs,Cors,我正在使用AngularJS创建一个web应用程序。为了测试它,我正在NodeJS服务器中运行应用程序,使用 在这个应用程序中,我需要通过POST请求向另一个主机发送一条JSON消息,并获得响应,因此,我正在使用 我的请求是通过实现一个使用的服务来完成的(我需要$http提供的抽象级别,所以我不使用) 这是我的密码。请注意,我修改$httpProvider,让AngularJS使用适当的CORS头发送请求 angular.module('myapp.services', []). // E

我正在使用AngularJS创建一个web应用程序。为了测试它,我正在NodeJS服务器中运行应用程序,使用

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

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

这是我的密码。请注意,我修改$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};
          });
      }
    }
  });
问题是我不能让它工作。我总是收到以下错误消息:

已阻止跨源请求:同一源策略不允许读取 远程主机上的远程资源。这可以通过移动 资源到同一域或启用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的回复

我的问题是我需要。我正在使用lighttpd进行开发和生产

-为什么简单的jQuery POST请求可以工作,而AngularJS POST请求不能工作?

我猜jqueryajax请求是默认的。还不确定


提前多谢

CORS不是在客户端处理的,而是在服务器上,您需要在您的angular应用试图发布的nodejs应用上允许CORS。如果您使用的是express,则可以尝试使用cors模块

另外,您需要检查options方法并返回200作为响应

为什么简单的jQuery POST请求可以工作,而AngularJS POST请求不能工作

jQuery使用而AngularJS使用


在angular code中,您可以将set
Content Type
添加到
应用程序/x-www-form-urlencoded
中,并使用
$对数据进行编码。param

很抱歉您的评论过于简单,但您不能只使用JSONP吗?@Chris JSONP的问题是您需要为它实现特定的逻辑,这意味着您必须告诉服务器在回调函数调用中构建js响应和包装de响应,这使得它非常特定于jsonp,因此您将无法在非jsonp调用中重用它,此外,除非您实现自己的响应回调解析器函数,否则它仅限于json。使用cors在服务器和客户端上都是一种更加一致和干净的方式,在b.中可能看起来是一种痛苦。。一开始,但在共享资源时会节省大量时间和精力在Angular中没有
useXDomain
。它从来没有进入角度代码。我没有用快车。那么,我是否需要事先发送一个选项请求,获取200状态响应,然后发送POST请求?因为我认为高级$resource服务会自动执行此操作,但我不能在这里使用它。不,您不需要执行任何操作,这一切都由浏览器处理,您的客户端代码保持不变,无论源代码是什么,POST、PUT和DELETE都是复杂的请求,因此浏览器首先发出选项请求,当它收到go-ahead(200)时,它会发送实际的请求,但要使其正常工作,您的服务器还需要能够响应复杂的请求,请查看本文Ok。我在浏览器控制台中看到发送的选项请求。对不起,我读得太快了。我需要修改服务器。但我实际上使用的是Node-http-server-app()。我不知道如何配置它。也许我可以换成lighttpd(生产服务器),但它还不能工作。但我想我已经接近了。我更新了问题,你看了我上次评论中链接的帖子了吗?