Node Express使用Restangular

时间:2016-12-01 21:50:47

标签: javascript node.js express cors restangular

我有一个离子应用程序,我使用restangular与节点表达应用程序进行通信。

当我将node express应用程序配置为使用http时,一切正常。

Ionic App方面:

RestangularProvider.setBaseUrl('http://11.22.33.44:3000');

// custom header
interceptors.serialNumber = function (element, operation, what, url, headers, query) {
  return {
    headers: angular.extend({
      'x-serialnumber': deviceStore.serialNumber
    }, headers)
  };
};

Restangular.one(‘Admin’).get()
 .then(function (data) {
    console.log(data);
   }, function (error) {
   console.log(error);
 });

Node Express App端:

var app = express();
app.use(cors());
app.get('/Admin, function(req, res) {
    console.log(admin-get');
    res.send(200);
});

我期待我需要处理飞行前的请求,因为cors节点模块声明:“一个复杂的例子' CORS请求是一个使用除GET / HEAD / POST之外的HTTP动词(例如DELETE)或使用自定义标题的请求。“所以我不确定为什么会这样做?

我将Ionic App和Node Express应用程序重新配置为使用https地址而不是http:

Ionic App方面:

RestangularProvider.setBaseUrl('https://11.22.33.44:3000');

// custom header
interceptors.serialNumber = function (element, operation, what, url, headers, query) {
  return {
    headers: angular.extend({
      'x-serialnumber': deviceStore.serialNumber
    }, headers)
  };
};

Restangular.one(‘Admin’).get()
 .then(function (data) {
    console.log(data);
   }, function (error) {
   console.log(error);
 });

Node Express App端:

var app = express();
app.use(cors());
app.get('/Admin, function(req, res) {
    console.log(admin-get');
    res.send(200);
});

当Ionic App执行GET请求时,我会在“网络”下的Chrome调试器中看到取消的OPTIONS请求(请求状态)。这告诉我,我需要在我的Node Express App端启用cors(虽然为什么在服务器配置了http而不是https时我没有看到这个错误?)。

所以我根据快递js cors模块文档在Node Express App端尝试了以下内容:

app.options('Admin', cors()); // enable pre-flight request 
app.get('/Admin', cors(), function(req, res) {
    console.log('admin-get');
    res.send(200);
});

我在“网络”下的Chrome调试器中看到相同的内容 - 取消取消的OPTIONS请求(请求状态)。我也试过

app.options('*', cors());

具有相同的结果。

然后我在Ionic App端删除了自定义标题(x-serialnumber)的插入。它现在有效。

那么,为什么Node Express应用程序配置了一个http地址而没有处理飞行前的请求,我希望由于在Ionic App端插入一个自定义标题?

当Node Express应用程序配置了https地址(以及Ionic App端)时,为什么我不处理OPTIONS请求?我配置cors的方式不正确吗?我错过了什么?

我认为这是一个cors问题,因为我可以在配置为https地址的情况下消除Ionic App端的自定义标头并且它可以工作。

我需要做些什么来实现这个目标?

更新

我尝试使用Angular JS $ http而不是Restangular。我得到了以下结果:

$http({
  method: 'GET',
  url: theUrl
}).then(function successCallback(response) {
  $http({
    method: 'GET',
    url: theUrl,
    headers: {
      'x-serialnumber' : deviceStore.serialNumber
    }
  }).then(function successCallback(response) {
  }, function errorCallback(response) {
  });
}, function errorCallback(response) {
});

我在Chrome网络调试器中看到第一个GET(减去自定义标头)消失了,我得到了一个很好的响应(200),然后是OPTIONS请求,我也得到了很好的响应( 200),然后是一个很好的GET,里面有自定义标题(得到很好的回复)。

如果我 NOT 执行此第一个GET请求减去自定义标头,则OPTIONS请求将在Angular JS Ionic App端中止,状态为-1。

注意:我可以更改Restangular请求的初始$ http请求(减去自定义标头)(减去自定义标头)

为什么这个初始GET减去了所需的自定义标头(即GET(减去自定义标题)| OPTIONS | GET(带有自定义标题))?

我不明白什么?

1 个答案:

答案 0 :(得分:0)

我需要做的是以下内容:

$http({
  method: 'GET',
  url: 'https://example.com/DUMMY'
}).then(function successCallback(response) {
  $http({
    method: 'GET',
    url: 'https://example.com',
    headers: {
      'x-serialnumber': deviceStore.serialNumber
    }
  }).then(function successCallback(response) {
    console.log('SUCCESS');
  }, function errorCallback(response) {
    console.log('FAILURE');
  });
}, function errorCallback(response) {
  console.log('FAILURE');
});

从本质上讲,我需要发送一个" 初步"使用自定义标头获取请求。 GET请求可以是我的节点快速服务器上的任何内容。在此之后" 初步" GET请求,我可以使用自定义标头执行GET请求。

特别是在服务器端,我看到以下内容:

GET /DUMMY 200 10ms - 2b
OPTIONS / 204 1ms
GET / 200 13ms - 1.03kb

不执行此操作" 初步"获取请求,我的Ionic App中的OPTIONS请求将中止 - 状态代码= -1 - 通常意味着请求已中止,并且永远不会离开Ionic App端。

我仍然不明白为什么我需要这个" 初步" GET请求,但这对我有用。