从angular发送https请求到nodejs。无法发送任何数据

时间:2016-08-20 15:50:05

标签: angularjs node.js http http-post

首先我有我的角度应用程序:

var app = angular.module('app', []);
angular.module('app.controllers', []);

app.config(function($httpProvider){
   delete $httpProvider.defaults.headers.common['X-Requested-With'];

   $httpProvider.defaults.headers.common = {};
   $httpProvider.defaults.headers.post = {};
   $httpProvider.defaults.headers.put = {};
   $httpProvider.defaults.headers.patch = {};
});

这是一个角度控制器:

angular.module('app').controller('loginController', ['$scope', '$http', function($scope, $http){

   $http({
       method: 'POST',
       url: 'https://xxx-xxx.c9users.io:xxxx/api/registerUser',
       headers: { 'Content-Type': 'application/json' },
       data: { test: 'something' }
   });

}]);

然后我的nodejs代码:

var express = require('express');
var app = express();
var bodyParser= require('body-parser');

app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
   next();
});

app.use(bodyParser.json());

var server = app.listen(process.env.PORT, function () {
   var host = server.address().address
   var port = server.address().port
});

app.post('/api/registerUser', function (req, res) {
   //req.body.test do something..
});

每当我尝试将此请求发送到节点服务器时。我在浏览器控制台中收到以下错误:

*选项https://xxx-xxx.c9users.io:xxx/api/registerUser *

XMLHttpRequest无法加载https://xxx-xxx.c9users.io:xxxx/api/registerUser。预检的响应包含无效的HTTP状态代码404

服务器永远不会收到请求。但是,如果我这样称呼它:

$http.post('https://xxx-xxx.c9users.io:xxxx/api/registerUser');

服务器在接收请求时不会遇到任何问题,但是没有数据。我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

如果您从其他域请求,则必须从服务器端允许跨源资源。

以下是如何使用express框架打开CORS的小节点片段。

NodeJS代码段

allowCrossDomain = function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
  if ('OPTIONS' === req.method) {
    res.send(200);
  } else {
    next();
  }
};

app.use(allowCrossDomain);

答案 1 :(得分:0)

我同意,在我看来你错过了选项方法。 另外添加:

res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");