3 votes

L'analyse de la chaîne de requête est tronquée par une apostrophe dans Node.js

Je suis en train de construire un serveur en Node.js qui reçoit des données de Javascript sur un site web. Les données sont envoyées en utilisant la méthode getJSON de jQuery, comme suit :

$.getJSON(
    url,
    {
        id: track.id,
        artist: track.artist,
        title: track.title,
        album: track.album,
        filename: track.filename,
        user: track.user,
        userId: track.userId,
        room: track.room,
        timestamp: track.timestamp
    }
);

J'essaie ensuite d'accéder aux données en utilisant le module url de Node comme ceci :

var urlObj = url.parse(request.url, true);
var jsonCallback = urlObj.query["callback"];

Cela fonctionne bien la plupart du temps, mais échoue lorsque l'un des paramètres contient une apostrophe. Il semble que l'analyse de la chaîne de requête s'arrête à l'apostrophe. Voici ce que console.log affiche pour deux objets de requête différents :

{ callback: 'jQuery15105242477038409561_1304925579219',
  id: '6c91c74db064c93f1f020000',
  artist: 'Radiohead',
  title: 'Everything In Its Right Place',
  album: 'Kid A',
  filename: '01 Everything In Its Right Place.m4a',
  user: 'Cowrelish',
  userId: '82a89b4df7a9120305000000',
  room: 'qwantz',
  timestamp: '1304924972555',
  _: '1304925611362' }
{ callback: 'jQuery15105242477038409561_1304925579221',
  id: '798cc74dfcce4337f7010000',
  artist: 'Toy Dolls',
  title: 'The Final Countdown',
  album: 'HOLY SHIT!!! IT' }

L'album pour le second est "HOLY SHIT !!! IT'S THE FINAL COUNTDOWN !", comme vous pouvez le voir, il a été tronqué à l'apostrophe.

J'ai essayé d'échapper l'apostrophe dans le code client, mais tout ce que j'obtiens est "album : 'HOLY SHIT !!! IT \\ '". Il échappe à la barre oblique, mais pas à l'apostrophe.

S'agit-il d'un bogue ou d'une caractéristique ? Devrais-je échapper les apostrophes d'une manière différente sur le client, ou chercher à corriger un bug dans Node.js ?

2voto

Geoff Chappell Points 1786

Vous ne devriez pas avoir à vous échapper du côté de jquery, et il ne semble pas que ce soit un bug de node (du moins avec la dernière version).

J'ai essayé de reproduire votre problème et je n'ai pas pu le faire en utilisant node 0.4.7.

C'est ce que j'ai fait :

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script type="text/javascript">
  $(document).ready(function () {
    $.getJSON('/', {test:"it's a test"});
  });
</script>

avec le code du nœud qui vient de le faire sur la requête entrante :

console.log(require('url').parse(req.url, true));

qui m'a donné :

{ test: 'it\'s a test' }

Il ne semble donc pas s'agir d'un problème général lié à jQuery ou à node.

Avez-vous regardé l'url complète avant qu'elle ne soit analysée ? Vous devriez pouvoir copier et coller cela dans le shell interactif de node et faire quelque chose comme ça pour tester :

require('url').parse('http://www.example.org/?q=it\'s working', true);

Y a-t-il quelque chose entre le navigateur et le serveur web qui pourrait modifier l'url ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X