【问题标题】:Cross domain ajax call failed - Angular.js node js + express跨域ajax调用失败-Angular.js节点js + express
【发布时间】:2013-11-26 09:54:49
【问题描述】:

我正在尝试从 angular.js 模块到 nodejs + express 服务器进行跨域调用,但我收到了未经授权的错误,或标头错误: 我遵循了 Cors 配置,但仍然遇到问题。

Angular.js 代码:

methods.getWelcomeApps = function (onSuccess, onError) {
        function makeBasicAuth(user, password) {
            var tok = user + ':' + password;
            var hash = btoa(tok);  // Base64 encoding
            return "Basic " + hash;
        }

        var auth = makeBasicAuth(config.API.AppsList.username, config.API.AppsList.password);
        $http.defaults.useXDomain = true;
        $http({method: 'GET', url: config.API.AppsList.url,  headers: {'Authorization': auth}})
            .success(onSuccess)
            .error(onError);
        };

    return methods;
});

And the node.js code:

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

我错过了什么吗?

谢谢。

【问题讨论】:

  • 而具体的错误是...?
  • 您不需要也允许 OPTIONS 吗?

标签: angularjs http-headers cors


【解决方案1】:

我认为这是不必要的

res.header('Access-Control-Allow-Headers', 'Content-Type');

这就够了

var allowCrossDomain = function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
};

也许你有兴趣:

我的完整工作代码 - angularjs 客户端服务和nodejs 服务端:

客户端(angularjs v1.0.8)

motoads/app/js/services.js

var motoAdsServices = angular.module('motoAdsServices', ['ngResource']);

motoAdsServices.factory('Brand', ['$resource', function($resource) {
    return $resource('http://localhost\\:3000/api/:id', {}, {
      query: {
        method: 'GET',
        params: {
          id: 'brands'
        },
        isArray: true
      }
    });
  }]);

服务器(nodejs + express)

motoads/server/server.js

var express = require('express');
var path = require('path');
var http = require('http');
var brands = require('./routes/brands');

var app = express();

var allowCrossDomain = function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
};

app.configure(function() {
  app.set('port', process.env.PORT || 3000);
  app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
  app.use(express.bodyParser()),
          app.use(allowCrossDomain);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.get('/api/brands', brands.findAll);

http.createServer(app).listen(app.get('port'), function() {
  console.log("Express server listening on port " + app.get('port'));
});

motoads/server/routes/brands.js

exports.findAll = function(req, res) {
  var fs = require('fs');
  var file = './server/data/brands.json';

  fs.readFile(file, 'utf8', function(err, data) {
    if (err) {
      throw err;
    }
    res.send(JSON.parse(data));
  });
};

motoads/server/data/brands.json

[
  {"name": "Audi", "models": [{"name": "A1"}, {"name": "A3"}, {"name": "A4"}]},
  {"name": "BMW", "models": [{"name": "Series 3"}, {"name": "Series 5"}, {"name": "Series 7"}]},
  {"name": "Citroen", "models": [{"name": "C1"}, {"name": "C2"}, {"name": "C3"}]},
  {"name": "Dacia", "models": [{"name": "Duster"}, {"name": "Logan"}, {"name": "Sandero"}]}
]

【讨论】:

    猜你喜欢
    • 2012-04-14
    • 2017-03-31
    • 1970-01-01
    • 2011-03-22
    • 2015-10-20
    • 2010-11-07
    • 1970-01-01
    • 2018-05-09
    • 2013-11-27
    相关资源
    最近更新 更多