node.js Error - throw new TypeError('first argument must be a string or Buffer');


I'm trying to implement a basic addition program in node.js that accepts 2 numbers through the URL (GET Request) adds them together, and gives the result.

    var http = require("http");
    var url1  = require("url");

    http.createServer(function(request, response) {
      response.writeHead(200, {"Content-Type": "text/plain"});
      var path = url1.parse(request.url).pathname;

      if(path == "/addition")
        console.log("Request for add recieved\n");

        var urlObj = url1.parse(request.url, true);

        var number1 =  urlObj.query["var"]; 
        var number2 =  urlObj.query["var2"];
        var num3 = parseInt(number2);
        var num4 = parseInt(number1);

        var tot = num3 + num4;

        response.write(number1 + number2);

        response.write("Invalid Request\n");              


      console.log("Server started.");

When I run, I'm getting 'Server started' message in the console. But when i request the url


I'm getting the following error :

http.js:593 throw new TypeError('first argument must be a string or Buffer');

When I comment out the line that displays the variable 'tot', the code is running, and the output I get is the concatenated value of the 2 get parameters I pass. In this case, it happens to be 1+20 = 120. I'm not able to convert the data into numerical format.

Where is the mistake in the code? And what does the error message basically mean?

Many thanks in advance.

5/30/2012 9:59:48 AM

Accepted Answer

You're passing numbers to response.write, when they should be strings. Like this:

response.write(total + '');

The variable total contains the number 21 because you passed the query parameters through parseInt() before summing. It will cause an error when sent through response.write unless you convert to a string first, by appending the empty string to it. number1+number2 is OK because they're strings, but their "sum" is "120".

I'd suggest also looking into the node.js package "express". It handles a lot of the basics for a HTTP server so you can write like:

var express=require('express');

var app=express.createServer();

app.get('/add',function(req,res) {
    var num1 = parseInt(req.query.var);
    var num2 = parseInt(req.query.var2);

    var total = num1 + num2;

    res.send(total + '');

5/6/2012 12:04:45 PM

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow