Comment faire de jQuery analyser ma réponse d'erreur représenté comme un json valide?

Voici mon code:

      $.ajax({
        url: "/api/invoice/" + newInvoice._id,
        type: 'PUT',
        data: JSON.stringify(newInvoice),
        dataType: 'json',
        contentType: "application/json; charset=utf-8"
      })
        .success(function () {
          $('#statusLine').text('Successfully submitted invoice {0}. Click here to dismiss.'.format(newInvoice._id));
        })
        .error(function (err) {
          alert(err);
        });

La demande:

PUT http://localhost:8000/api/invoice/16211 HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Content-Length: 770
Origin: http://localhost:8000
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://localhost:8000/invoice.html?id=16211
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{"items":[{"id":...

Le corps de la requête est en fait un json valide, je viens tronquée pour des raisons de concision.

La réponse:

HTTP/1.1 409 Conflict
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 1386
ETag: 250542419
Connection: keep-alive

{
  "msg": "Cannot update the invoice #16211, because it has already been updated by someone else.",
  "invoice": {
    "items": [
      {...

Encore une fois, la réponse est tout à fait valable, json, tronqué pour des raisons de concision.

Comme prévu, le error gestionnaire est appelé avec le err objet. Cependant, comment puis-je mettre la main sur l'analyse json? Bien sûr, j'ai pu vérifier que le type de contenu de la réponse json et ensuite d'analyser le err.responseText moi-même, mais n'est-ce pas ce que l'ajax de jQuery est censé faire pour moi? Je veux dire, il le fait pour mon $.get requêtes lorsque je reçois les objets du serveur.

Ce qui me manque?

MODIFIER

C'est une correction de https://stackoverflow.com/a/12310751/80002:

Faire la demande:

var ajax = $.ajax(...

De traitement de la réponse d'erreur:

var res, ct = ajax.getResponseHeader("content-type") || '';
if (ct.indexOf('json') > -1) {
  res = $.parseJSON(err.responseText);
  //process the response here
}
InformationsquelleAutor mark | 2012-09-07