2

最初のノードの js アプリを作成したいと考えています。このためには、公開の Twitter ツイートを取得し、ツイートをリクエスト応答として出力する必要があります。私はたくさん検索しましたが、古いノード バージョンのコードで記述されたコードを取得しました (つまり、createServer、addListener のようなもの)。ノード バージョン 0.6.18 で、Twitter 呼び出しを要求し、json を応答として出力するコードをどのように記述しますか?

以下は私が試した古いコードです

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 + "/");

そして、エラーが発生しました

$ 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)
4

1 に答える 1

1

あなたのエラーは一般的なものです。それ以外の:

setInterval(getTweats(), 1000);

あなたが必要

setInterval(getTweats, 1000);

これは、関数自体setIntervalを呼び出したいためです。getTweats

あなたのコードにはgetTweats()、代わりに with 括弧があります。これが最初に呼び出され、 結果が に渡されます。この結果は(あなたの関数は何も返さない) であるため、ノードはそれを呼び出すことができません。getTweatssetIntervalundefined

于 2012-07-26T12:38:53.510 に答える