web-dev-qa-db-fra.com

nodejs express, publication ajax avec jquery et réponse reçue

Ayant des problèmes pour obtenir une réponse rapide à ma demande jQuery ajax. La publication réelle fonctionne bien, mais peu importe ce que j'essaie, je ne peux pas sembler réellement obtenir une réponse de données de mon application que je peux utiliser. Au début, il ne faisait que poster et accrocher en permanence, et comme une minute plus tard, il répondait par une alerte qui disait quelque chose comme "Un document XML chargé" (je ne sais pas d'où il venait) - En tout cas, maintenant, c'est moi qui le donne

SyntaxError: Jeton inattendu ILLEGAL à l'analyse (native) à IncomingMessage .

Dans mon application express, j'ai:

    app.post('/save', function(req, res) {
      console.log(req.body.objectData);
      res.contentType('json');
      res.send({ some: 'json' });
    });

et dans mon jquery:

  $.ajax({
    url: "/save",
    type: "POST",
    dataType: "json",
    data: {objectData: someObject},
    contentType: "application/json",
    cache: false,
    timeout: 5000,
    complete: function() {
      //called when complete
      console.log('process complete');
    },

    success: function(data) {
      console.log(data);
      console.log('process sucess');
   },

    error: function() {
      console.log('process error');
    },
  });
21
thrice801

Vous n'envoyez pas une réponse JSON valide, mais une chaîne contenant le mot json. Par conséquent, la fonction JSON.parse() échoue côté client. Essaye ça:

app.post('/save', function(req, res) {
  console.log(req.body.objectData);
  res.contentType('json');
  res.send({ some: JSON.stringify({response:'json'}) });
});

JavaScript Object Notation est un moyen de partager des données entre applications au format objet. Cependant, vous ne pouvez pas envoyer un objet via une requête HTTP sans d'abord le transformer en chaîne et l'envoyer en tant que variable unique. Les fonctions JSON.parse() et JSON.stringify() le font pour nous.

21
Pastor Bones

Le commentaire du pasteur Bones était particulièrement important pour moi car j'utilisais $ .ajax pour publier sur un serveur de nœud. Ma partie pertinente du code a fini comme ça:

// Incoming parameter "teams" is an array of objects
function saveTeams(teams) {
    var xhr;
    var data = JSON.stringify({ teams: teams });

    xhr = $.ajax({
        type: "POST",
        url: "http://localhost:8000/saveteam",
        contentType: "application/json",
        data: data,
        headers: {
            Authorization: "..."
        }
    });

    return xhr;
} 

Notez que l'en-tête contentType est pertinent pour que l'analyse fonctionne.

Du côté du serveur de noeud, je peux traiter la charge comme ceci:

saveTeams: function (req, res, next) {
    var teams = req.body.teams;

    if (teams.length > 0) {
        console.log("Teams to be added:");
        for (var i = 0; i < teams.length; i++) {
            console.log(teams[i]);
            // ...
        }
    }
    // ...
}
2
CLO

Depuis que vous utilisez express,

res.contentType('json');

devrait être:

res.type('json');

mais la définition du type n’est pas obligatoire car elle est faite automatiquement pour vous.

Voir le express api docs sur res.type .

Notez également que, pour l'express, res.send({blah:"gee"}); convertit automatiquement les objets JSON à l'aide de JSON.stringify en interne. Après avoir cliqué sur le lien ci-dessus, cliquez sur res.send et, tant que vous y êtes, res.json, ce qui évite une surcharge de temps processeur lorsque vous savez que vous envoyez du JSON. Notez que si vous envoyez du JSON, le type est automatiquement défini sur JSON.

Toujours mieux de regarder la source ! Notez que res.send appelle this.json quand il détecte JSON, et que res.json appelle this.send (ouais, ça ressemble à une boucle, mais tout se passe bien).

1
Montana123