Sunday, September 11, 2011

Node.js 入門:範例試跑


前一篇 Node.js 準備試跑 描述 Long Polling 實作概念。
本篇文章將運作兩個 node.js 範例,程式內容可以在 [2.] 以及 [4.] 找到。

Node.js 環境 for Mac

前陣子安裝了 CoffeScript,連帶把 node.js 給裝好了。
$brew install coffee-script
至於 CoffeScript 是啥米碗糕,又是另一則故事哩。brew 類似 Ubuntu/Debian 的 apt-get 或是 Fedora 的 Yum,皆為套件管理機制。

Mac 最廉價, 有效率的 IDE - Vim

參考 Vim 設定檔安裝 的設定方法,讓 iTerm 2 使用 Vim 時,能夠將程式碼標記上色 Syntax highlight。

其他環境需求

請先安裝 Apache 在 Mac 中,實作範例我採用 MAMP (Mac, Apache, MySQL, PHP) 應用程式,安裝說明可以參考梅問題網站的教學(單純跑 Node.JS 不需要安裝上述環境)

範例程式 01 - Hello World
node_hello.js
var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Node.js\n');
}).listen(8080, "localhost");

console.log('Server running at http://localhost:8080/');
Port 可以自行指定,不要與系統或是現行的重複即可。 還沒完喔,記得要執行剛剛所鍵入的 node.js 檔案。
$node node_hello.js
接著打開瀏覽器輸入 http://localhost:8080 就可以看到它呈現 Hello Node.js。

範例程式 02 - Twitter News
tweet_streamer.js
var sys = require("sys"),
    http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs"),
    events = require("events");

// 檢查 URL 檔案是否存在
function load_static_file(uri, response) {
        var filename = path.join(process.cwd(), uri);
        path.exists(filename, function(exists) {
                if(!exists) {
                        response.writeHead(404, {"Content-Type": "text/plain"});
                        response.write("404 Not Found\n");
                        response.end();
                        return;
                }

                fs.readFile(filename, "binary", function(err, file) {
                        if(err) {
                                response.writeHead(500, {"Content-Type": "text/plain"});
                                response.write(err + "\n");
                                response.end();
                                return;
                        }

                        response.writeHead(200);
                        response.write(file, "binary");
                        response.end();
                });
        });
}

var twitter_client = http.createClient(80, "api.twitter.com");
var tweet_emitter = new events.EventEmitter();

// 取得 Twitter 資訊
function get_tweets() {
        var request = twitter_client.request("GET", "/1/statuses/public_timeline.json", {"host": "api.twitter.com"});

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

                response.addListener("end", function() {
                        var tweets = JSON.parse(body);
                        if(tweets.length > 0) {
                                tweet_emitter.emit("tweets", tweets);
                        }
                });
        });

        request.end();
}

setInterval(get_tweets, 5000);

// 建立Socket 處理自動更新 
http.createServer(function(request, response) {
    var uri = url.parse(request.url).pathname;
    if(uri === "/stream") {

        var listener = tweet_emitter.addListener("tweets", function(tweets) {
                response.writeHead(200, { "Content-Type" : "text/plain" });
                response.write(JSON.stringify(tweets));
                response.end();

                clearTimeout(timeout);
        });

        var timeout = setTimeout(function() {
                response.writeHead(200, { "Content-Type" : "text/plain" });
                response.write(JSON.stringify([]));
                response.end();

                tweet_emitter.removeListener(listener);
        }, 10000);

    }
    else {
        load_static_file(uri, response);
    }
}).listen(8080);

sys.puts("Server running at http://localhost:8080/");
tweet_streamer.html 省略,參考 [2.] 的 Source Code
注意如果直接從 [2.]  下載下來運行的話,要先更改一些地方不然會報錯。

  • response.close() -> response.end()
  • response.sendHeader() -> response.writeHeader()


接著一樣執行前述的程式碼
$node tweet_streamer.js

打開網頁執行 http://localhost:8080/ 可以看到以下輸出就成功囉。

Reference

[1.] Node.js入門
[2.] Learning Server-Side JavaScript with Node.js
[3.] The Node Beginner Book
[4.] [教學] Nodejs 學習筆記 (1) -- 建立開發環境

No comments:

Post a Comment