2015-01-09 3 views
0

У меня есть вызов HTTP $ POST в AngularJS, который не будет отображать ответ сервера, если запрос был плохим.

myFactory.create = function(formData) { 
    deferred = $q.defer() 
    $http({method: 'POST', url: url, responseType: 'json', data: formData}) 
    .then(function(data) { 
     deferred.resolve(data); 
    }, function(response, status, headers, config) { 
     deferred.reject(response); 
    }); 

    return deferred.promise; 
}; 

Когда я отправляю неверные данные, API отвечает 400-Bad Request. Если я посмотрю на ответ в инструментах разработчика Chrome, есть текстовое сообщение: «Вертикаль неверен». Однако это сообщение не находится в ответе на обратный вызов ошибки $ http.

Я могу получить все остальное (статус, заголовки и конфиг), но мои данные ответа равны нулю.

Успешные POST обрабатываются правильно, поэтому я знаю, что функция обычно работает.

Любая идея, почему я мог бы увидеть ответ в Chrome, но не смог получить к нему доступ через $ http?

+4

предложение: не создавайте обещаний, в которых уже существуют обещания. Это известно как анти-шаблон. – rahpuser

+0

Можете ли вы опубликовать часть, в которой вы действительно получаете данные из обещанного обещания? Плюс, я просто предполагаю, что вы меняете «url» на переменную, хотя этого не существует. И вы не объявляли отложенным как var. – gsalisi

+0

Да. «url» на самом деле является переменной и генерируется в другом месте на моей фабрике. Прямо сейчас, я только что проверил его с помощью console.log (response), чтобы узнать, что возвращается при возникновении ошибки. –

ответ

0

Вы можете реорганизовать к этому:

myFactory.create = function(formData) { 
    var url = 'api/create'; 
    return $http({ 
    method: 'POST', 
    url: url, 
    responseType: 'json', //Are you sure that it is returning a json?? 
    data: formData 
    }); 
}; 

Затем проверьте возвращение обещание, как это там, где вы хотите назвать это,

myFactory.create().then(
    function(data){ 
    console.dir(data); 
    },function(response, status, headers, config) { 
    console.dir(response); 
    }); 

Это должно работать, и вы должны увидеть данные о журналы.

+0

Если вы не уверены в ответе и хотите частично помочь, лучше использовать комментарии. –

+0

Простите, но этот ответ слишком длинный, чтобы комментировать и имеет очень высокую вероятность быть верным. Возможно, некоторые изменения в том, как я сказал, сделают это лучше. – gsalisi

+0

Я не согласен, вы не меняете логику кода, кроме удаления $ q.defer() и возвращаете HTTP-обещание напрямую, так как OP говорит, что данные ответа равны null, это не поможет. Единственным оставшимся случаем является то, что сервер OP не может возвращать действительный JSON, который вы упомянули, и который можно суммировать в комментарии. Я думаю, если это так, вопрос будет закрыт как простая типографская ошибка. –