Skip to content

Commit 195c75e

Browse files
author
William Wang
committedApr 27, 2016
Member Model implement
1 parent ab6185f commit 195c75e

File tree

7 files changed

+272
-35
lines changed

7 files changed

+272
-35
lines changed
 

‎.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
node_modules
2+
*.log

‎errors/GeneralErrors.js

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
var util = require('util');
3+
4+
var Internal = function(data) {
5+
this.name = 'InternalError';
6+
this.message = data || 'Internal Error';
7+
this.code = 500;
8+
};
9+
10+
util.inherits(Internal, Error);
11+
12+
var NotFound = function(data) {
13+
this.name = 'NotFoundError';
14+
this.message = data || 'Not Found';
15+
this.code = 404;
16+
};
17+
18+
util.inherits(NotFound, Error);
19+
20+
var Database = function(data) {
21+
this.name = 'DatabaseError';
22+
this.message = data || 'Database Error';
23+
this.code = 500;
24+
};
25+
26+
util.inherits(Database, Error);
27+
28+
var Parameter = function(data) {
29+
this.name = 'ParameterError';
30+
this.message = data || 'Invalid Parameters';
31+
this.code = 400;
32+
};
33+
34+
util.inherits(Parameter, Error);
35+
36+
var Existed = function(data) {
37+
this.name = 'ExistedError';
38+
this.message = data || 'Object Existed';
39+
this.code = 400;
40+
};
41+
42+
util.inherits(Existed, Error);
43+
44+
var Server = function(data) {
45+
this.name = 'ServerError';
46+
this.message = data || 'Server Error';
47+
this.code = 500;
48+
};
49+
50+
util.inherits(Server, Error);
51+
52+
var APIService = function(data) {
53+
this.name = 'APIServiceError';
54+
this.message = data || 'API Service Error';
55+
this.code = 400;
56+
};
57+
58+
util.inherits(APIService, Error);
59+
60+
61+
module.exports = {
62+
NotFound: NotFound,
63+
Parameter: Parameter,
64+
Database: Database,
65+
Server: Server,
66+
APIService : APIService,
67+
Existed: Existed,
68+
Internal: Internal
69+
};

‎libs/db.js

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
var mysql = require('mysql');
2-
var debug = require('debug')('MYSQL');
1+
//一樣在連接DB的時候改採用knex來進行連接
2+
var knex = require('knex')({
3+
client: 'mysql',
4+
connection: {
5+
host : '127.0.0.1',
6+
port : 8889,
7+
user : 'root',
8+
password : 'root',
9+
database : 'blog'
10+
},
11+
pool: {
12+
min: 0,
13+
max: 7
14+
}
15+
});
316

4-
var pool = mysql.createPool(process.env.DB_PATH || 'mysql://root:root@localhost:8889/blog');
5-
6-
module.exports = pool;
17+
module.exports = knex;

‎libs/migrate.js

+47-29
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ var bcrypt = require('bcryptjs');
33
var async = require('async');
44

55
var salt = "blog-password-salt-edu-nccu-soslab";
6-
6+
//上次我們使用了一般的方法直接連接DB
77
var memberList = [{
88
name : "William1",
99
password : "password1",
@@ -20,14 +20,15 @@ var memberList = [{
2020
account : "account3"
2121
}];
2222

23-
db.query("DROP DATABASE blog", function(err) {
24-
if(err) {
25-
console.log(err);
26-
} else {
27-
console.log("CLEAR");
28-
}
29-
});
30-
23+
//像是這樣直接下SQL指令透過nodejs來操作資料庫
24+
// db.query("DROP DATABASE blog", function(err) {
25+
// if(err) {
26+
// console.log(err);
27+
// } else {
28+
// console.log("CLEAR");
29+
// }
30+
// });
31+
//
3132
// insertMember(memberList,function(err) {
3233
// if(err) {
3334
// console.log(err);
@@ -37,24 +38,41 @@ db.query("DROP DATABASE blog", function(err) {
3738
// });
3839

3940

40-
function insertMember(memberList, cb) {
41-
async.each(memberList, function(member, callback) {
42-
db.query("INSERT INTO member (name, account, password) VALUES (?, ?, ?)",[
43-
member.name,
44-
member.account,
45-
bcrypt.hashSync(salt+member.password, 10)
46-
], function(err, result) {
47-
if(err) {
48-
callback(err);
49-
} else {
50-
callback(null);
51-
}
52-
});
53-
}, function(err) {
54-
if(err) {
55-
cb(err);
56-
} else {
57-
cb(null);
58-
}
41+
// function insertMember(memberList, cb) {
42+
// async.each(memberList, function(member, callback) {
43+
// db.query("INSERT INTO member (name, account, password) VALUES (?, ?, ?)",[
44+
// member.name,
45+
// member.account,
46+
// bcrypt.hashSync(salt+member.password, 10)
47+
// ], function(err, result) {
48+
// if(err) {
49+
// callback(err);
50+
// } else {
51+
// callback(null);
52+
// }
53+
// });
54+
// }, function(err) {
55+
// if(err) {
56+
// cb(err);
57+
// } else {
58+
// cb(null);
59+
// }
60+
// })
61+
// };
62+
//這次要使用SQL builder來幫我們簡化這些動作
63+
//
64+
db("member")
65+
.insert({
66+
name: "Test",
67+
account: "account",
68+
password: "password"
69+
})
70+
.then(function(result) {
71+
var insertedId = result[0];
72+
console.log(insertedId);
5973
})
60-
};
74+
.catch(function(err) {
75+
console.log(err);
76+
});
77+
78+
//所以現在我們可以開始幫我們的資料庫撰寫資料model方便之後使用

‎models/Member.js

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//這是一個Member Model
2+
var db = require('../libs/db'); //引入我們的sql builder
3+
var GeneralErrors = require('../errors/GeneralErrors');
4+
5+
var Member = function(options) {
6+
this.id = options.id;
7+
this.name = options.name;
8+
this.password = options.password;
9+
this.account = options.account;
10+
};
11+
12+
//Class Function
13+
Member.get = function(memberId, cb) {
14+
//這邊是當傳入一個memberId時,進入資料庫查出相對應的member資料
15+
db.select()
16+
.from('member')
17+
.where({
18+
id : memberId
19+
})
20+
.map(function(row) {
21+
//將select出來的資料轉換成Member物件
22+
return new Member(row);
23+
})
24+
.then(function(memberList) {
25+
if(memberList.length) {
26+
cb(null, memberList[0]);
27+
} else {
28+
//這邊要產生一個NotFound err給前端,因為error很常用到,我們會獨立出去一個檔案
29+
cb(new GeneralErrors.NotFound());
30+
}
31+
})
32+
.catch(function(err) {
33+
cb(err);
34+
})
35+
}
36+
37+
//我們接下來嘗試是否可以正確取得資料
38+
//接下來完成其他會用到的function
39+
//Instance Function
40+
Member.prototype.save = function (cb) {
41+
//save的概念是當物件不存在時新增,存在時對DB做更新
42+
if (this.id) {
43+
//已存在
44+
db("member")
45+
.where({
46+
id : this.id
47+
})
48+
.update({
49+
name : this.name,
50+
account : this.account,
51+
password : this.password
52+
})
53+
.then(function() {
54+
cb(null, this);
55+
}.bind(this))
56+
.catch(function(err) {
57+
console.log("MEMBER UPDATED", err);
58+
cb(new GeneralErrors.Database());
59+
});
60+
} else {
61+
//不存在
62+
db("member")
63+
.insert({
64+
name: this.name,
65+
account: this.account,
66+
password: this.password
67+
})
68+
.then(function(result) {
69+
var insertedId = result[0];
70+
this.id = insertedId;
71+
cb(null, this);
72+
}.bind(this))
73+
.catch(function(err) {
74+
console.log("MEMBER INSERT", err);
75+
cb(new GeneralErrors.Database());
76+
});
77+
}
78+
};
79+
80+
//這樣基本上就完成了一個DataModel會用到的method, 之後有需要的時候再過來新增
81+
module.exports = Member;

‎package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"debug": "~2.2.0",
1515
"ejs": "~2.3.3",
1616
"express": "~4.13.1",
17+
"knex": "^0.10.0",
1718
"morgan": "~1.6.1",
1819
"mysql": "^2.10.2",
1920
"serve-favicon": "~2.3.0"

‎routes/index.js

+57-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,65 @@
11
var express = require('express');
22
var router = express.Router();
3-
3+
var Member = require('../models/Member');
44
/* GET home page. */
55
router.get('/', function(req, res, next) {
66
res.render('index', { title: 'Express' });
77
});
88

9+
router.get('/:memberId', function(req, res) {
10+
Member.get(req.params.memberId, function(err, member) {
11+
if(err) {
12+
res.status(err.code);
13+
res.json(err);
14+
} else {
15+
res.json(member);
16+
}
17+
})
18+
19+
});
20+
21+
//所以我們這樣就完成了一個model的function
22+
//
23+
//在這邊再測試一次是否可以進行新增或是修改
24+
25+
router.post('/members', function(req, res) {
26+
//首先必須先產生出一個Member的物件在進行save
27+
var newMember = new Member({
28+
name : req.body.name,
29+
account : req.body.account,
30+
password : req.body.password
31+
});
32+
newMember.save(function(err) {
33+
if(err) {
34+
res.status(err.code);
35+
res.json(err);
36+
} else {
37+
res.json(newMember);
38+
}
39+
});
40+
});
41+
42+
router.put('/members/:memberId', function(req, res) {
43+
//必須先取得該member在進行update
44+
Member.get(req.params.memberId, function(err, member) {
45+
if(err) {
46+
res.status(err.code);
47+
res.json(err);
48+
} else {
49+
//取得member, 進行update及save
50+
member.name = req.body.name || member.name; //這樣的寫法表示當req.body.name不存在時以member.name當作值
51+
member.account = req.body.account || member.account;
52+
member.password = req.body.password || member.password;
53+
member.save(function(err) {
54+
if(err) {
55+
res.status(err.code);
56+
res.json(err);
57+
} else {
58+
res.json(member);
59+
}
60+
});
61+
}
62+
});
63+
64+
});
965
module.exports = router;

0 commit comments

Comments
 (0)
Please sign in to comment.