Rahul PK
Rahul PK

Reputation: 270

How to output a twitter api respose using node js version 0.6.18

I wish to create a first node js app. For this I need to pull the public twitter tweet and output tweet as a request response. I searched a lot but I got code that written in older node version code(ie createServer, addListener something like this). How we write code for request a twitter call and output the json as response in node version 0.6.18?

Following is the older code I tried

var http = require("http");
var events = require("events");
var port = 8001;
var twitterClient = http.createClient(80, 'api.twitter.com');
var tweetEmitter = new events.EventEmitter();
var request = twitterClient.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"});

function getTweats() {

    request.addListener("response", function (response) {
        var body = "";

        response.addListener("data", function (data) {
            body += data;
        });

        response.addListener("end", function (end) {
            var tweets = JSON.parse(body);
            if (tweets.length > 0) {
                tweetEmitter.emit("tweets", tweets);
                console.log(tweets, 'tweets loaded');
            }
        });
    });

    request.end();
}

setInterval(getTweats(), 1000);


http.createServer(function (request, response) {
    var uri = url.parse(request.url).pathname;
    console.log(uri);
    if (uri === '/stream') {
        var cb = function (tweets) {
            console.log('tweet'); // never happens!
            response.writeHead(200, {"Content-Type": "text/plain"});
            response.write(JSON.stringify(tweets));
            response.end();
            clearTimeout(timeout);
        };
        tweetEmitter.addListener("tweets", cb);

        // timeout to kill requests that take longer than 10 secs
        var timeout = setTimeout(function () {
            response.writeHead(200, {"Content-Type": "text/plain"});
            response.write(JSON.stringify([]));
            response.end();
            tweetEmitter.removeListener("tweets", cb);
        }, 10000);

    } else {
        loadStaticFile(uri, response);
    }

}).listen(port);

console.log("Server running at http://localhost:" + port + "/");

And got error

$ node tweet.js 
Server running at http://localhost:8001/

timers.js:223
    callback.apply(timer, args);
             ^
TypeError: Cannot call method 'apply' of undefined
    at Timer.ontimeout (timers.js:223:14)

Upvotes: 2

Views: 785

Answers (1)

Ruben Verborgh
Ruben Verborgh

Reputation: 3665

Your error is a common one. Instead of:

setInterval(getTweats(), 1000);

you need

setInterval(getTweats, 1000);

This is because you want setInterval to call the getTweats function itself.

Your code has getTweats() with parentheses instead. This calls getTweats first, and gives the result to setInterval. Since this result is undefined (your function doesn't return anything), node cannot call it.

Upvotes: 1

Related Questions