node.js 的小程式記錄


花了前後大約5,6小時用 node.js 寫了一個小程式.
事緣因為之前寫了一個 Python(bottle) 版的 Simple Todo
所以這次就用 node.js 來實現.其實網路上也有人寫了相同的東西
但這裡有點不同的是後端資料庫主要以 SQLite3 為主.
還有就是應用了比較新的版本吧.

建置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 建立程式目錄
mkdir node-simple-todo
cd node-simple-todo

# 建立用來存放 Node 模組的目錄
# 同時安裝在程式中將會用到的模組
# - express (web framework)
# - express-csrf (web framework's module, security checking for cross site submit)
# - ejs (template engine)
# - sqlite3 (database connect module)
# - date-utils (date time helper)
mkdir node_modules
npm install express
npm install express-csrf
npm install ejs
npm install sqlite3
npm install date-utils

# 之後便是通過指令建立整個應用結構
# 打開 Session 支持, 模板引擎將改用 ejs (因為 express 預設是 jade 引擎)
# 由於所在目錄不是空的.所以會問是否真的需要建立 (回答 Y,並不會刪除任何東西,只會覆蓋)
./node_modules/.bin/express -s --template ejs
destination is not empty, continue? y

# 最後就是執行 Server 作測試
# http://localhost:3000/
node app.js

設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 引入模組
var express = require('express'),
csrf = require('./library/express-csrf'),
config = require('./config'),
todo = require('./controllers/todo');

// 建立伺服器
var app = module.exports = express.createServer();

// 對伺服器進行一些基本的設定
app.configure(function(){
app.set('views', __dirname + '/views'); // 存放模板的位置
app.set('view engine', 'ejs'); // 將模版引擎設定為 ejs
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: config.session_secret_key }));
app.use(csrf.check()); // 每當提交時進行誇站請求檢查
app.use(app.router);
app.use(express.static(__dirname + '/public')); // 可公開瀏覽的目錄名
});

// 伺服器器運行環境,可以依個別情況進行設定
// 調用 NODE_ENV=production node app.js
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
app.use(express.errorHandler());
});

// 註冊一些自定義的小助手,供給模板中應用
app.helpers({
config: config
});

// 會變動的,不會被緩存幫手
app.dynamicHelpers({
csrf: csrf.token
});

// 路由器的設定,當請求不同網址時則回調相應的行為/方法
app.get('/', todo.index);
app.post('/new', todo.new);
app.get('/delete/:id', todo.delete);
app.get('/finish/:id', todo.finish);
app.get('/unfinish/:id', todo.unfinish);
app.get('/edit/:id', todo.edit);
app.post('/save', todo.save);

// 監聽端口 3000 則 http://you_site:3000/
app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

至於這 app.js 中提到的 todo.js 和 config.js 可參考我的 GitHub
Node.js 是不錯的東西.只是在處理多類型 DB 上.好像還是差了一個比較好用的模組.