2012-08-17 18 views
35

Estoy tratando de permitir que javascript se comunique con un servidor Node.js.Servidor Node.js que acepta solicitudes POST

solicitud POST (Javascript)

var http = new XMLHttpRequest(); 
var params = "text=stuff"; 
http.open("POST", "http://someurl.net:8080", true); 

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
http.setRequestHeader("Content-length", params.length); 
http.setRequestHeader("Connection", "close"); 

alert(http.onreadystatechange); 
http.onreadystatechange = function() { 
    if (http.readyState == 4 && http.status == 200) { 
    alert(http.responseText); 
    } 
} 

http.send(params); 

En este momento el código del servidor Node.js se parece a esto. Antes se usaba para solicitudes GET. No estoy seguro de cómo hacerlo funcionar con las solicitudes POST.

servidor (Node.js)

var server = http.createServer(function (request, response) { 
    var queryData = url.parse(request.url, true).query; 

    if (queryData.text) { 
    convert('engfemale1', queryData.text, response); 
    response.writeHead(200, { 
     'Content-Type': 'audio/mp3', 
     'Content-Disposition': 'attachment; filename="tts.mp3"' 
    }); 
    } 
    else { 
    response.end('No text to convert.'); 
    } 
}).listen(8080); 

Gracias de antemano por su ayuda.

+1

Tendría que usar los eventos 'data' /' end' de 'request', creo. Esto funciona para mí: http://pastebin.com/6aKv7WHJ. Sin embargo, no estoy seguro de si esa es la forma real de hacerlo. – pimvdb

+0

Creo que puede haber algún problema con la solicitud de javascript POST. No estoy recibiendo datos en el servidor node.js cuando intento hacer una solicitud. –

+1

Aunque creo que ese es el código correcto para el archivo de nodo. El javascript es el problema –

Respuesta

75

El siguiente código muestra cómo leer valores de un formulario HTML. Como @pimvdb dijo que necesitas usar request.on ('data' ...) para capturar el contenido del cuerpo.

http = require('http'); 
fs = require('fs'); 
server = http.createServer(function(req, res) { 

    console.dir(req.param); 

    if (req.method == 'POST') { 
     console.log("POST"); 
     var body = ''; 
     req.on('data', function (data) { 
      body += data; 
      console.log("Partial body: " + body); 
     }); 
     req.on('end', function() { 
      console.log("Body: " + body); 
     }); 
     res.writeHead(200, {'Content-Type': 'text/html'}); 
     res.end('post received'); 
    } 
    else 
    { 
     console.log("GET"); 
     //var html = '<html><body><form method="post" action="http://localhost:3000">Name: <input type="text" name="name" /><input type="submit" value="Submit" /></form></body>'; 
     var html = fs.readFileSync('index.html'); 
     res.writeHead(200, {'Content-Type': 'text/html'}); 
     res.end(html); 
    } 

}); 

port = 3000; 
host = '127.0.0.1'; 
server.listen(port, host); 
console.log('Listening at http://' + host + ':' + port); 

Si utiliza algo así como Express.js entonces se puede simplificar a algo como esto desde expreso se ocupa de una gran cantidad de la tubería de HTTP para usted:

var express = require('express'); 
var fs = require('fs'); 
var app = express(); 

app.use(express.bodyParser()); 

app.get('/', function(req, res){ 
    console.log('GET /') 
    //var html = '<html><body><form method="post" action="http://localhost:3000">Name: <input type="text" name="name" /><input type="submit" value="Submit" /></form></body>'; 
    var html = fs.readFileSync('index.html'); 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end(html); 
}); 

app.post('/', function(req, res){ 
    console.log('POST /'); 
    console.dir(req.body); 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.end('thanks'); 
}); 

port = 3000; 
app.listen(port); 
console.log('Listening at http://localhost:' + port) 

En ambos casos estoy leyendo " index.html", que es un archivo HTML muy básico con el código JavaScript que está utilizando:

<html> 
<body> 
    <form method="post" action="http://localhost:3000"> 
     Name: <input type="text" name="name" /> 
     <input type="submit" value="Submit" /> 
    </form> 

    <script type="text/JavaScript"> 
     console.log('begin'); 
     var http = new XMLHttpRequest(); 
     var params = "text=stuff"; 
     http.open("POST", "http://localhost:3000", true); 

     http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     //http.setRequestHeader("Content-length", params.length); 
     //http.setRequestHeader("Connection", "close"); 

     http.onreadystatechange = function() { 
      console.log('onreadystatechange'); 
      if (http.readyState == 4 && http.status == 200) { 
       alert(http.responseText); 
      } 
      else { 
       console.log('readyState=' + http.readyState + ', status: ' + http.status); 
      } 
     } 

     console.log('sending...') 
     http.send(params); 
     console.log('end'); 

    </script> 

</body> 
</html> 
+0

El problema que estoy teniendo ahora es que el javascript ni siquiera puede hacer una solicitud. Cuando intento hacer una solicitud, el archivo node.js no hace nada. –

+2

Eso podría deberse a que el código anterior que incluí no envió ninguna respuesta para la solicitud POST (solo se muestra en el servidor que recibimos una POST). He actualizado el código para que realmente responda en el POST y eso lleva preocuperase por ello. También incluí el código HTML que usé para probarlo (que incluye tu código JavaScript) –

+0

Muchas gracias, esto funciona. –

4

Recibe POST y GET solicitud por nodejs:

1) .server

var http = require('http'); 
    var server = http.createServer (function(request,response){ 

    response.writeHead(200,{"Content-Type":"text\plain"}); 
    if(request.method == "GET") 
     { 
      response.end("received GET request.") 
     } 
    else if(request.method == "POST") 
     { 
      response.end("received POST request."); 
     } 
    else 
     { 
      response.end("Undefined request ."); 
     } 
}); 

server.listen(8000); 
console.log("Server running on port 8000"); 

2). Cliente:

var http = require('http'); 

var option = { 
    hostname : "localhost" , 
    port : 8000 , 
    method : "POST", 
    path : "/" 
} 

    var request = http.request(option , function(resp){ 
     resp.on("data",function(chunck){ 
      console.log(chunck.toString()); 
     }) 
    }) 
    request.end(); 
Cuestiones relacionadas