2015-08-17 2 views
3

Я использую угловой JS для отправки некоторых данных на сервер nodejs.

Когда я использую, локон, я получаю назад данные я отправляю (правильный результат):

curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" 'http://127.0.0.1:3000/s?table=register_rings&uid=1' 
> {"MyKey":"My Value"} 

Однако, когда я использую angularjs службы, встретилась ошибка.

.factory('RegisterRingsService', function($http, $q) { 
    // send POST request with data and alert received 
    function send(data, uid) { 

    $http({ 
      method: 'POST', 
      url: 'http://127.0.0.1:3000/s?table=register_rings&uid=1', 
      data: '{"MyKey":"My Value"}', 
      headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin":"*"}, 
      responseType: 'json' 
     }).success(function(data, status, headers, config) { 
      alert('success', data, status); 
     }).error(function(data, status, headers, config) { 
      alert('error' + JSON.stringify(data) + JSON.stringify(status)); 
     }).catch(function(error){ 
      alert('catch' + JSON.stringify(error)); 
     }); 
} 

return {send : send}; 
    }) 

Ошибка заключается в следующем:

{"data":null,"status":0,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"url":"http://127.0.0.1:3000/s?table=register_rings","data":"{\"MyKey\":\"My Value\"}","headers":{"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Accept":"application/json, text/plain, */*"},"responseType":"json"},"statusText":""} 

Я подозреваю, что я должен вставить заголовок CORS, но я не уверен, как это сделать.

Любая помощь будет оценена

+1

Клиент не отправляет CORS заголовки, как это, сервер является тот, который отправляет обратно 'Access-Control-Allow -Origin: * ', чтобы браузер знал, что запрос разрешен. – mscdex

ответ

3

Проблема в том, как вы передачи данных к серверу. Это связано с тем, что jQuery и Angular сериализуют данные по-разному.

По умолчанию jQuery передает данные с использованием Content-Type: x-www-form-urlencoded и знакомой сериализации foo=bar&baz=moe. Однако AngularJS передает данные, используя Content-Type: application/json и { "foo": "bar", "baz": "moe" } Сериализация JSON, к сожалению, некоторые языки веб-сервера, особенно PHP, не отделяются от нуля.

Чтобы обойти это решение, разработчики AngularJS предоставили крючки в услугу $http, чтобы мы наложили x-www-form-urlencoded.

$http({ 
    method :'POST', 
    url:'...', 
    data: data, // pass in data as strings 
    headers :{'Content-Type':'application/x-www-form-urlencoded'} // set the headers so angular passing info as form data (not request payload) 
}); 

Пожалуйста, прочтите этот пост в течение рабочего раствора:

http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/

+0

отлично, спасибо за разъяснение и предоставление ссылки на очень полезный пост – Zbynek