1 {
2 'Név': 'Galiba Péter',
3 'Nick': 'Poetro',
4 'Leírás':
5 '1998 óta foglalkozik weboldalak ' +
6 'készítésével, és JavaScript-tel.' +
7 '2006 óta saját céggel rendelkezik, ' +
8 'és azóta a NowPublic.com, majd ' +
9 '2009 óta az Examiner.com front-end ' +
10 'fejlesztője.',
11 'Specialitások': [
12 'HTML', 'CSS',
13 'PHP', 'Drupal',
14 'JavaScript', 'jQuery', 'Node.js'
15 ],
16 'Weboldalak': [
17 'http://poetro.hu/',
18 'https://github.com/Poetro',
19 'http://weblabor.hu/tagok/1519'
20 ]
21 }
1 $ mkdir node-latest-install
2 $ cd node-latest-install
3 $ curl http://nodejs.org/dist/node-latest.tar.gz | tar xz --strip-components=1
4 $ ./configure
5 $ make install
1 $ curl http://npmjs.org/install.sh | sh
$ curl http://npmjs.org/install.sh | sh
npm ls [kulcsszó]
npm install modulnév [modulnév…]
npm uninstall modulnév [modulnév…]
npm update [modulnév…]
npm help
Egy egyszerű blog motor megvalósítása.
app.js
blog.db
dictionaries\
├─ en.js
└─ hu.js
lib\
├─ date.js
├─ entry.js
└─ route.js
public\
└─ css\
├─ global.css
└─ reset.css
views\
├─ entries.ejs
├─ entry.ejs
├─ form─entry.ejs
├─ index.ejs
├─ layout.ejs
└─ partials\
└─ entry.ejs
1 var express = require('express'),
2 dialect = require('dialect').dialect,
3 app = module.exports = express.createServer(),
4 sqlite = require('sqlite'),
5 dbPool = require('generic-pool').Pool({
6 'name' : 'SQLite Pool',
7 'create' : function (callback) {
8 var db = new sqlite.Database();
9 db.open('blog.db', function (err) {
10 if (err) throw err;
11 callback(db);
12 });
13 },
14 'destroy' : function (db) {
15 db.close(function (error) {
16 if (error) throw error;
17 });
18 },
19 'max' : 1
20 });
1 // Előkészítjük az adatbázist.
2 dbPool.acquire(function (db) {
3 db.execute(
4 'CREATE TABLE IF NOT EXISTS entries (' +
5 'nid INTEGER PRIMARY KEY ASC,' +
6 'title TEXT,' +
7 'created INTEGER,' +
8 'updated INTEGER,' +
9 'body TEXT' +
10 ')',
11 function (error) {
12 dbPool.release(db);
13 if (error) {
14 throw error;
15 }
16 }
17 );
18 });
1 // Konfiguráció, ami minden környezetben lefut
2 app.configure(function(){
3 app.set('views', __dirname + '/views');
4 app.set('view engine', 'ejs');
5 app.use(express.bodyDecoder());
6 app.use(app.router);
7 app.use(connect.compiler({
8 src: __dirname + '/public', autocompile: true,
9 enable: ['less', 'coffeescript']
10 })),
11 app.use(express.staticProvider(__dirname + '/public'));
12 });
13 // Fejlesztői környezet beállításai (ez az alapértelmezett)
14 app.configure('development', function () {
15 app.use(express.errorHandler({ dumpExceptions: true,
16 showStack: true }));
17 });
18 // Éles környezet beállításai (NODE_ENV=production)
19 app.configure('production', function () {
20 app.use(express.errorHandler());
21 });
1 app.get(/^\/entries\/(\d+)\/?/, function (request, response) {
2 var entryId = request.params[0];
3 entry.load(+entryId, function (error, row) {
4 if (!row) {
5 response.send(t(['{entryId} does not exist',
6 {entryId : ''+entryId, count: 1}]), 404);
7 }
8 else {
9 response.render('entry', {'locals': row});
10 }
11 });
12 });
13 app.get(/^\/entry\/?/, function (request, response) {
14 response.render('form-entry', {locals: {title: '', body: '', created: '', updated: '', nid: ''}});
15 });
16 app.post(/^\/entries\/?/, function (request, response) {
17 var body = request.body;
18 if (body.nid && body.op && body.op === t('Delete')) {
19 entry.destroy(body.nid); response.redirect('entries');
20 }
21 else {
22 entry.create(body); response.redirect('entries/' + (body.nid || ''));
23 }
24 });
Node.js esetén általában két módon futtathatunk aszinkron műveletek:
Hagyományos callback függvényekkel
1 fs.readdir('/path/to/directory', function (error, files) {});
Feliratkozunk egy eseményre
1 request.on('data', function (chunk) { });
2 // illetve, ami ugyanez:
3 request.addListener('data', function (chunk) { });
EventEmitter objektummal ki tudjuk terjeszteni objektumunkat, ha saját eseményeket akarunk kiváltani, és kezelni
1 var MyObj = function () {}, sys = require('sys'), myobj;
2 sys.inherits(MyObj, require('events').EventEmitter);
3 myobj = new MyObj();
4 myobj.on('event', function () {});
5 myobj.emit('event');
1 function Entry(dbPool) {
2 // Ha nem konstruktorként lett meghívva, hívjuk meg úgy.
3 if (!(this instanceof Entry)) return new Entry(dbPool);
4 this.dbPool = dbPool;
5 }
6
7 Entry.prototype = {
8 findAll : function (callback) {
9 var dbPool = this.dbPool;
10 dbPool.acquire(function (db) {
11 db.execute(
12 'SELECT * FROM entries',
13 function (error, rows) {
14 dbPool.release(db);
15 callback && callback(error,
16 (!rows || !rows.length) ? null : rows);
17 }
18 );
19 });
20 },
1 update : function (attr, callback) {
2 var dbPool = this.dbPool;
3 dbPool.acquire(function (db) {
4 db.execute(
5 'REPLACE INTO entries ' +
6 '(nid, title, created, updated, body) VALUES' +
7 '($nid, $title, $created, $updated, $body)',
8 {
9 $nid: +attr.nid || undefined,
10 $title: attr.title,
11 $created: attr.created || Date.now() / 1000 | 0,
12 $updated: Date.now() / 1000 | 0,
13 $body: attr.body
14 },
15 function (error, rows) {
16 dbPool.release(db);
17 callback && callback(error, rows);
18 }
19 );
20 });
21 },
1 load : function (nid, callback) {
2 var dbPool = this.dbPool;
3 dbPool.acquire(function (db) {
4 db.execute(
5 'SELECT * FROM entries WHERE nid = ?', [+nid],
6 function (error, rows) {
7 dbPool.release(db);
8 callback && callback(error,
9 (!rows || !rows.length) ? null : rows[0]);
10 }
11 );
12 });
13 },
<%- változó %>
<%= változó %>
Feltételek:
1 <% if (true) { %>
2 Igaz
3 <% } %>`
Ciklusok:
1 <% for (var i=a.length-1; i >= 0; i--) { %>
2 <%= i %>
3 <% } %>
Részelemek (partials):
1 <%- partial('entry', { collection: entries, as: global }) %>
1 <article>
2 <h1 class="entry-title"><%= title %></h1>
3 <p>
4 <time class="published" pubdate="pubdate"
5 datetime="<%= formatDate('c', created) %>">
6 <%= t(['Published at {date}',
7 {date : formatDate('F jS, Y g:i a', created),
8 count: 1}]) %>
9 </time> |
10 <time class="updated"
11 datetime="<%= formatDate('c', updated) %>">
12 <%= t(['Updated at {date}',
13 {date : formatDate('F jS, Y g:i a', updated),
14 count: 1}]) %>
15 </time>
16 </p>
17 <div class="entry-content"><%- body %></div>
18 <a href="/entry/<%= nid %>"><%= t('Edit') %></a>
19 </article>
Az EJS-en kívül még számos sablonozó rendszer érhető el Node.js alatt:
CSS-hez:
jspp - http://www.jspp.io/ : olyan mintha PHP lenne
1 <html>
2 <body>
3 <div class="test1">
4 <?jspp $(this).text("This is server side!"); end(); ?>
5 </div>
6 </body>
7 </html>
Zombie.js - http://zombie.labnotes.org/
CoffeScript - http://jashkenas.github.com/coffee-script/
Table of Contents | t |
---|---|
Exposé | ESC |
Source Files | s |
Slide Numbers | n |
Notes | 2 |
Help | h |