Search code examples
javascriptnode.jsnodes

Node.js server that accepts POST requests


I'm trying to allow javascript to communicate with a Node.js server.

POST request (web browser)

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

Right now the Node.js server code looks like this. Before it was used for GET requests. I'm not sure how to make it work with POST requests.

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

Solution

  • The following code shows how to read values from an HTML form. As @pimvdb said you need to use the request.on('data'...) to capture the contents of the body.

    const http = require('http')
    
    const server = http.createServer(function(request, response) {
      console.dir(request.param)
    
      if (request.method == 'POST') {
        console.log('POST')
        var body = ''
        request.on('data', function(data) {
          body += data
          console.log('Partial body: ' + body)
        })
        request.on('end', function() {
          console.log('Body: ' + body)
          response.writeHead(200, {'Content-Type': 'text/html'})
          response.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>
                </html>`
        response.writeHead(200, {'Content-Type': 'text/html'})
        response.end(html)
      }
    })
    
    const port = 3000
    const host = '127.0.0.1'
    server.listen(port, host)
    console.log(`Listening at http://${host}:${port}`)
    
    
    

    If you use something like Express.js and Bodyparser then it would look like this since Express will handle the request.body concatenation

    const express = require('express')
    const fs = require('fs')
    const app = express()
    const bodyParser = require("body-parser");
    
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: false }))
    
    // parse application/json
    app.use(bodyParser.json())
    
    app.get('/', function(request, response) {
      console.log('GET /')
      const html = `
        <html>
            <body>
                <form method="post" action="http://localhost:3000">Name: 
                    <input type="text" name="name" />
                    <input type="submit" value="Submit" />
                </form>
            </body>
        </html>`
      response.writeHead(200, {'Content-Type': 'text/html'})
      response.end(html)
    })
    
    app.post('/', function(request, response) {
      console.log('POST /')
      console.dir(request.body)
      response.writeHead(200, {'Content-Type': 'text/html'})
      response.end('thanks')
    })
    
    const port = 3000
    app.listen(port)
    console.log(`Listening at http://localhost:${port}`)