Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

node.js

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(tot);
        response.write(number1 + number2);

      }
      else
      {
        response.write("Invalid Request\n");              
      }
      response.end();

    }).listen(8889);

      console.log("Server started.");

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

`http://localhost:8889/addition?var=1&var2=20`

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.

like image 977
Krish Avatar asked May 06 '12 11:05

Krish


1 Answers

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 + '');
});

app.listen(8888);
like image 167
jjrv Avatar answered Oct 16 '22 09:10

jjrv