Ce que je veux faire:
Envoyez simplement quelques données (json par exemple), à un serveur http node.js, en utilisant des requêtes jquery ajax.
Pour une raison quelconque, je n'arrive pas à obtenir les données sur le serveur, car il ne déclenche jamais l'événement "data" de la demande.
Code client:
$.ajax({
url: server,
dataType: "jsonp",
data: '{"data": "TEST"}',
jsonpCallback: 'callback',
success: function (data) {
var ret = jQuery.parseJSON(data);
$('#lblResponse').html(ret.msg);
},
error: function (xhr, status, error) {
console.log('Error: ' + error.message);
$('#lblResponse').html('Error connecting to the server.');
}
});
Code serveur:
var http = require('http');
http.createServer(function (req, res) {
console.log('Request received');
res.writeHead(200, { 'Content-Type': 'text/plain' });
req.on('data', function (chunk) {
console.log('GOT DATA!');
});
res.end('callback(\'{\"msg\": \"OK\"}\')');
}).listen(8080, '192.168.0.143');
console.log('Server running at http://192.168.0.143:8080/');
Comme je l'ai dit, il n'entre jamais dans l'événement "data" de la demande.
Commentaires:
1. Il enregistre le message "Demande reçue";
2. La réponse est correcte, je ne peux pas la gérer sur le client, avec des données;
De l'aide? Suis-je en train de manquer quelque chose?
Merci d'avance à tous.
MODIFIER:
Version finale du code commentée, basée sur la réponse:
Code client:
$.ajax({
type: 'POST' // added,
url: server,
data: '{"data": "TEST"}',
//dataType: 'jsonp' - removed
//jsonpCallback: 'callback' - removed
success: function (data) {
var ret = jQuery.parseJSON(data);
$('#lblResponse').html(ret.msg);
},
error: function (xhr, status, error) {
console.log('Error: ' + error.message);
$('#lblResponse').html('Error connecting to the server.');
}
});
Code serveur:
var http = require('http');
http.createServer(function (req, res) {
console.log('Request received');
res.writeHead(200, {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*' // implementation of CORS
});
req.on('data', function (chunk) {
console.log('GOT DATA!');
});
res.end('{"msg": "OK"}'); // removed the 'callback' stuff
}).listen(8080, '192.168.0.143');
console.log('Server running at http://192.168.0.143:8080/');
Puisque je veux autoriser les requêtes interdomaines, j'ai ajouté une implémentation de CORS .
Merci!
Pour que l'événement 'data' se déclenche côté serveur node.js, vous devez POST les données. C'est-à-dire que l'événement 'data' ne répond qu'aux données POSTed. Spécification de 'jsonp 'car le format de données force une requête GET, car jsonp est défini dans la documentation jquery comme:
"jsonp": Charge dans un bloc JSON en utilisant JSONP. Ajoute un "? Callback =?" Supplémentaire à la fin de votre URL pour spécifier le rappel
Voici comment modifier le client pour déclencher votre événement de données.
<html>
<head>
<script language="javascript" type="text/javascript" src="jquery-1.8.3.min.js"></script>
</head>
<body>
response here: <p id="lblResponse">fill me in</p>
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
url: 'http://192.168.0.143:8080',
// dataType: "jsonp",
data: '{"data": "TEST"}',
type: 'POST',
jsonpCallback: 'callback', // this is not relevant to the POST anymore
success: function (data) {
var ret = jQuery.parseJSON(data);
$('#lblResponse').html(ret.msg);
console.log('Success: ')
},
error: function (xhr, status, error) {
console.log('Error: ' + error.message);
$('#lblResponse').html('Error connecting to the server.');
},
});
});
</script>
</body>
</html>
Quelques lignes utiles pour vous aider à déboguer côté serveur:
var http = require('http');
var util = require('util')
http.createServer(function (req, res) {
console.log('Request received: ');
util.log(util.inspect(req)) // this line helps you inspect the request so you can see whether the data is in the url (GET) or the req body (POST)
util.log('Request recieved: \nmethod: ' + req.method + '\nurl: ' + req.url) // this line logs just the method and url
res.writeHead(200, { 'Content-Type': 'text/plain' });
req.on('data', function (chunk) {
console.log('GOT DATA!');
});
res.end('callback(\'{\"msg\": \"OK\"}\')');
}).listen(8080);
console.log('Server running on port 8080');
Le but de l'événement de données côté nœud est de constituer le corps - il se déclenche plusieurs fois par une seule requête http, une fois pour chaque bloc de données qu'il reçoit. Il s'agit de la nature asynchrone de node.js - le serveur effectue d'autres travaux entre la réception de blocs de données.