2012-05-13 1 views
2

je fait une extension Chrome qui appelle la méthode ajax jQuery:Comment puis-je récupérer l'objet que j'ai passé dans l'attribut `data` de jQuery.ajax() côté serveur (node.js)?

contenu-script.js

[...] 
$.ajax({ 
    "url": "http://localhost:5000/", 
    "type": "PUT", 
    "contentType": "application/json", 
    "data": { "name": "random object" }, 
    "dataType": "json" 
}); 
[...] 

Du côté du serveur, je suis en train de chercher les informations transmises dans l'attribut data:

web.js

[...] 
app.put('/', function(request, response) { 
    console.log(request.data); 
}); 
[...] 

Mais je reçois undefined à la place. Comment l'objet est-il passé dans l'attribut data supposé être récupéré côté serveur (Node.js + express.js)?

J'ai aussi essayé console.log(request) et a beaucoup de choses là-dedans, mais rien qui ressemblait à l'info je suis passé le long dans l'attribut data ...

EDIT

Ma dernière tentative (basée sur la réponse de graydsl) apporte les modifications suivantes au code ci-dessus:

  • Ajouté app.use(express.bodyParser()); juste avant app.put....
  • Changé put-post partout
  • changé request.data à request.body.data

Maintenant, le code fait ce que je veux au moment de répondre à une forme comme ceci:

<form method="post" action="/"> 
    <input name="data" type="text" value="WOO HA" /> 
    <input type="submit" name="submit" value="submit" /> 
</form> 

Cependant, il ne parvient toujours pas si je revenir à utiliser post au lieu de put (et le navigateur finit sur http://localhost:5000/?data=WOO+HA&submit=submit pour une raison quelconque)

Il échoue également lorsque put ting (ou post ing) avec ajax (voir le code ci-dessus). Lorsque je tente avec ajax, je reçois ce sur le serveur:

SyntaxError: Unexpected token ILLEGAL 
    at Object.parse (native) 
    at IncomingMessage.<anonymous> (/home/shawn/.node_libraries/.npm/connect/1.8.7/package/lib/middleware/bodyParser.js:135:16) 
    at IncomingMessage.emit (events.js:61:17) 
    at HTTPParser.onMessageComplete (http.js:133:23) 
    at Socket.ondata (http.js:1019:22) 
    at Socket._onReadable (net.js:683:27) 
    at IOWatcher.onReadable [as callback] (net.js:177:10) 

Répondre

6
  1. Comme d'autres l'ont mentionné, et vous êtes en train de faire, vous devez utiliser le bodyParser `middleware. Si le corps de la requête a un type de contenu "application/json", bodyParser l'analysera dans un objet, qui sera situé à request.body. Ainsi dans votre cas request.body.name devrait être "objet aléatoire".

Je pense que vous (et plusieurs des intervenants précédents) accrochez mentalement sur le fait que la méthode ajax jQuery utilise le nom de clé « de données » pour un objet à envoyer (sérialisé comme JSON) dans la demande corps, et glissant magiquement à l'hypothèse que tout ce qui traite la requête du côté serveur appellera également cet objet par le nom de "données". Il n'y a aucun lien entre les deux.

+1

J'ai réussi à faire le code dans mon post original (avant l'édition) fonctionne avec les changements suivants: Comme vous l'avez suggéré, utilisez 'request.body.name' plutôt que' request.data' et en utilisant 'JSON.stringify' sur l'objet passé à l'attribut data de jQuery.Voici l'exemple de travail: content-script: http://pastebin.com/iY1V5bWC, sur le serveur: http://pastebin.com/r7B6sjdm. Cependant, cela ne fonctionne pas avec plusieurs domaines. Au lieu de cela, mon navigateur (chrome) bloque le PUT et dit "Origin http://fiddle.jshell.net n'est pas autorisé par Access-Control-Allow-Origin." Ceci est une autre question cependant. – Shawn

+0

FYI J'ai essayé d'utiliser GET au lieu de PUT avec le même résultat: Il est bloqué par le chrome lors de l'interdomaine. – Shawn

+0

@Shawn en ce qui concerne les domaines inter-domaines, avez-vous essayé d'envoyer les bons en-têtes de l'intérieur de votre itinéraire epxress? Res.header "Accès-Contrôle-Autoriser-Origine", "*" res.header "Accès-Contrôle-Autoriser-En-têtes", "X-Demandé-Avec" – jeroenbourgois

0

L'attribut de données jquery se traduit en une chaîne de requête ou données post avant d'être envoyé au serveur. Pour le récupérer, utilisez node.js pour décoder les paramètres GET et POST.

Vous avez dit utiliser express.js. Dans express.js, si vous passez data comme ceci: { EmployeeName : "George" } puis, dans express.js, request.params.EmployeeName contiendra "George".

+0

J'ai essayé d'utiliser POST au lieu de PUT, mais toujours 'request.params.key' renvoie' undefined' ('request.params' renvoie' [] '). – Shawn

+0

Essayez de faire une demande à la main dans le navigateur sur www.test.com/my-handler?test_var=test_string, puis vérifiez request.params. Si elle renvoie des chaînes passées, il se peut que le code qui transmet les données soit incorrect. –

+0

J'ai essayé d'utiliser GET au lieu de POST et en utilisant la barre d'adresse du navigateur pour faire la demande avec 'http: // localhost: 5000/myHandler? RandomName = randomObject'. Cependant, 'request.params.randomName' renvoie' undefined' et 'request.params' renvoie' [] '. – Shawn

3

Vous devez utiliser req.body.data. Quelque chose comme cela devrait fonctionner:

app.post('/', function(req, res) { 
    console.log(req.body.data); 
    res.redirect('/'); 
}); 

Jetez un oeil à ce lien: bodyParser

J'espère que je pourrais vous aider!:)

EDIT: Je viens de trouver un bon lib pour travailler avec $ .ajax, ça s'appelle: superagent. Vous pourriez envisager de l'essayer. Cela semble prometteur. :)

Mise à jour

Le problème se trouve dans votre code jquery pas dans le code de Node.js. Vous ne pouvez pas envoyer un objet dans la propriété data de l'objet settings, vous devez stringifier d'abord l'objet de données. Vous pouvez utiliser le json2.js de l'impressionnant D - au - M. Douglas Crockford: json2.js

Après avoir inclus cette bibliothèque le code suivant devrait vous donner le résultat souhaité:

$().ready(function() { 

    var data = { 
     data: "My name is", 
     name: "Slim Shady" 
    }; 

    stringifiedData = JSON.stringify(data); 

    $.ajax({ 
     "url": "http://127.0.0.1:3000/", 
     "type": "PUT", 
     "contentType": "application/json", 
     "data": stringifiedData, 
     "dataType": "json" 
    }); 
}); 

Et dans l'application .js:

app.put('/', function(req, res) { 
    console.log(req.body.data + "... " + req.body.name); 
    res.redirect('/'); 
}); 
+0

Cela ne fonctionne pas: 'TypeError: Impossible de lire la propriété 'data' de undefined' – Shawn

+0

Utilisez-vous le middleware bodyParser? Quelque chose comme 'app.use (express.bodyParser());'? – jsbeckr

+1

Peut-être changer res.redirect à res.send ou quelque chose. Parce que res.redirect ne fait pas vraiment ce que vous attendez de lui quand la requête utilise ajax. – Pickels

Questions connexes