10. Argumente
• klein & leichtgewichtig
• gleiche Sprache wie im Browser
• asynchrones I/O
• HTTP-Client und -Server
• keine Threads
11. Installation
# download
$ git clone git://github.com/ry/node.git
# compile
$ cd node
$ ./configure
$ make
# run
$ ./node hello.js
# read doc
$ man doc/node.1
12. Hallo Welt (Konsole)
// import module
var sys = require("sys");
// greet the world
sys.puts("Hallo, Welt");
12
13. Hallo Welt (Server)
// import module
var http = require("http");
// create an HTTP server on port 8000
http.createServer(function(req, res) {
res.sendHeader(200, {"content-type": "text/plain"});
res.sendBody("Hallo, Welt");
res.finish();
}).listen(8000);
13
14. Promises
// import module
var sys = require("sys");
var posix = require("posix");
// load a file
var promise = posix.open("file.txt", posix.O_RDONLY);
promise.addCallback(function(fd) {
var promise = posix.read(fd, 1024, 0, "utf-8");
promise.addCallback(function(data) {
sys.puts(data);
posix.close(fd);
});
});
// shortcut
var data = posix.cat("file.txt").wait();
14
15. Echo-Server
var tcp = require("tcp");
var server = tcp.createServer(function (socket) {
socket.setEncoding("utf8");
socket.addListener("connect", function () {
socket.send("hellorn");
});
socket.addListener("receive", function (data) {
socket.send(data);
});
socket.addListener("eof", function () {
socket.send("goodbyern");
socket.close();
});
});
server.listen(7000);
23. add & dispatch message
// chat.js
var channel = {
messages: [],
callbacks: [],
addMessage: function(cmd, nick, text) {
var m = {cmd: cmd, nick: nick, text: text};
this.messages.push(m);
for (var i in callbacks) {
this.callbacks[i](m);
}
}
...
};
23
24. get old messages
// chat.js
fu.get("/get", function(req, res) {
var session = sessions[req.uri.params.id];
var since = parseInt(req.uri.params.since, 10);
channel.query(since, function(messages) {
res.json(200, {messages: messages});
});
});
24
25. get msg & register interest
// chat.js
var channel = {
...,
query: function(since, callback) {
var matching = [];
for (var i in messages) {
if messages[i].timestamp > since)
matching.push(messages[i]);
}
if (matching.length > 0) {
callback(matching);
} else {
callbacks.push(callback);
}
}
};
25
26. cleanup
setInterval(function () {
var now = new Date();
while (callbacks.length > 0 &&
now - callbacks[0].timestamp > 30*1000) {
callbacks.shift().callback([]);
}
}, 1000);