nodejs express, ajax, publicación w / jquery y recepción de respuesta

Tener algunos problemas para obtener expreso para responder correctamente a mi solicitud jjaq ajax. La publicación real está funcionando bien, pero no importa lo que intente, parece que no puedo obtener una respuesta de datos de mi aplicación que pueda usar. Al principio solo estaba publicando y colgando constantemente, y como un minuto más tarde respondería con una alerta que decía algo así como “Documento XML cargado” (no tengo idea de dónde venía) – De todos modos, ahora me está dando

SyntaxError: token ILLEGAL inesperado en el análisis (nativo) en IncomingMessage.

En mi aplicación expresa, tengo:

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

y en mi 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'); }, }); 

No está enviando una respuesta JSON válida sino una Cadena que contiene la palabra json por lo que JSON.parse() está fallando en el lado del cliente. Prueba esto:

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

La notación de objetos de JavaScript es una forma de compartir datos entre aplicaciones en formato de objeto. Sin embargo, no puede enviar un objeto a través de una solicitud HTTP sin primero convertirlo en una cadena y enviarlo como una sola variable. Las funciones JSON.parse() y JSON.stringify() hacen esto por nosotros.

El comentario de Pastor Bones fue particularmente importante para mí, ya que estaba usando $ .ajax para publicar en un servidor Node. Mi parte relevante del código terminó así:

 // 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; } 

Tenga en cuenta que el encabezado contentType es relevante para que funcione el análisis.

En el lado del servidor de nodo, puedo procesar la carga útil de esta manera:

 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]); // ... } } // ... } 

Ya que estás usando Express,

 res.contentType('json'); 

debiera ser:

 res.type('json'); 

pero no es necesario establecer el tipo, ya que se realiza automáticamente.

Ver los documentos expresos de la API en res.type .

También tenga en cuenta que, por expreso, res.send({blah:"gee"}); Convierte automáticamente los objetos json usando JSON.stringify internamente. Después de hacer clic en el enlace anterior, haga clic en res.send y, mientras está en ello, res.json , que ahorra una pequeña sobrecarga de procesador cuando sabe que está enviando JSON. Tenga en cuenta que si envía JSON, el tipo se establece automáticamente en JSON.

Siempre es mejor mirar la fuente ! Tenga en cuenta que res.send llama a this.json cuando detecta JSON, y que res.json llama a this.send (sí parece un bucle pero todo funciona).