2012-08-17 19 views
35

Próbuję zezwolić javascriptowi na komunikację z serwerem Node.js.Serwer Node.js, który akceptuje żądania POST

żądanie 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); 

Teraz kod serwera node.js wygląda następująco. Zanim został użyty do żądania GET. Nie wiem, jak sprawić, by działała z żądaniami POST.

Server (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); 

Dzięki z góry za pomoc.

+1

Musiałbym użyć zdarzeń 'data' /' end' z 'request', jak sądzę. To działa dla mnie: http://pastebin.com/6aKv7WHJ. Nie jestem pewien, czy to prawdziwy sposób na zrobienie tego. – pimvdb

+0

Myślę, że może być coś złego w żądaniu POST javascript. Nie odbiera danych na serwerze node.js, gdy próbuję wykonać żądanie. –

+1

Chociaż myślę, że jest to poprawny kod dla pliku węzła. Problem z javascriptem jest teraz –

Odpowiedz

75

Poniższy kod ilustruje sposób odczytywania wartości z formularza HTML. Jak @pimvdb powiedział, że musisz użyć request.on ("dane" ...), aby uchwycić zawartość ciała.

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); 

Jeśli używasz coś podobnego Express.js to może być uproszczone do czegoś takiego od ekspresowe dba o wielu kanalizacji HTTP dla Ciebie:

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) 

W obu przypadkach Czytam " index.html”, który jest bardzo prosty plik HTML z JavaScript, który używasz:

<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

Problemem, który mam teraz jest to, że javascript nie może nawet zażądać. Kiedy próbuję wykonać żądanie, plik node.js nic nie robi. –

+2

Mogło tak być dlatego, że poprzedni kod, który zawierałem, nie wysłał żadnej odpowiedzi na żądanie POST (wyświetlił się tylko na serwerze, na którym otrzymaliśmy POST.) Zaktualizowałem kod tak, aby rzeczywiście odpowiadał w POST i to troszczyć się o coś. Zawarłem również kod HTML, który użyłem do jego przetestowania (który zawiera twój kod JavaScript). –

+0

Dziękuję bardzo za to. –

4

Otrzymuj POST i GET żądanie w 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). Klient:

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(); 
Powiązane problemy