2013年6月9日 星期日

node.js 之學習 Express 的筆記(3)-搭起資料庫的橋樑(使用MySQL)

恩! 睽違已久的第三篇,終於出現了!!
最近不是偷懶,是太忙(><),
關於前面的幾集,還麻煩大家多多關照&指教。

既然node.js可以是一種使用JavaScript來做前端跟後端的事,那麼讓人開始思考如何使用Express跟資料庫做連結,昨天開始我起手做這件事情,沒想到接二連三的碰壁,這篇會介紹到基本的CURD的操作(是說...難的我也不會,我對SQL並沒有很熟)。 哦!對了,很多網路上的文章是使用MongoDB,不過因為我還是node.js新手,目前還是先選擇使用自己曾經用過的MySQL。




環境背景:


linux環境下(使用上週申請的MiCloud的smartOS作為練習用途的環境)
node.js Express + mysql(記得裝完Express之後要npm install mysql)
然後我的Express資料夾目錄名為miblog (只是個名稱)...



miblog-
|-app.js 
|-mysql_practice.js (請手動增加此檔案)
|-node_modules 
|-package.json 
|-public 
|-routes
 -views
*mysql_practice.js :
我之後會在這個檔案寫所有的mysql的事情,包含連線方式,
之後會直接使用node mysql_practive.js的方式直接去run這個檔案&測試結果。





資料庫與資料表的結構:




mysql -uroot -p
Enter password:
mysql> use miblog;
mysql> show tables;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(15) | NO   |     | NULL    |                |
| comment | text        | NO   |     | NULL    |                |
| time    | text        | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+



關於資料表的部分,簡而言之就是我是為了之後要做一個類似留言版的東西
所以目前database命名為miblog,與資料夾同檔名。
資料表目前只有一個,名為Comments;
  •     欄位id =>流水編號
  •     name=> 儲存留言者的姓名
  •     comment=>儲存留言者的評論
  •     time=>儲存留言時間




Part1: 打開mysql_practice:



首先是require mysql,接著一些基本的資料庫設定。

var mysql = require('mysql');
var DATABASE = 'miblog';
var TABLE ='comments';

var connection = mysql.createConnection({
  host:'localhost',
  user:'root',
  password:'YOUR Password(這裡是...你的密碼...)',
});

connection.query('USE ' +  DATABASE);

這裡有件事情是,有看過有人寫mysql.createClient(書也是這樣寫),不過我這樣寫就error了。
500 TypeError: Object #<Object> has no method 'createClient'
後來上網查了一下發現,要用createConnection取代createClient。


















Part 2 : 撈資料的簡單示範


上面的設定都做好了以後,接著開始最基本的撈資料,
比方說,我要撈出所有comments資料表的內容,以前的sql是這樣下:
select * from comments;
不過在node.js的express要資料的方式為query( );

connection.query('SELECT * FROM ' + TABLE, function(err, results, fields){
      if(err) throw err;
      console.log(results);
      console.log(fields);
      connection.end();
});


後面的callback function做的事情為如果有錯誤就會throw,沒有的話將會log出results跟fields,最後在end connection。
(不過我自己個人覺得log出來的results比較有用,但有時候table資料過多時,會有點可怕,是否只需要知道有沒有成功就好,XD,或是使用results.affectedRows來得知影響的筆數)


順帶一提,query最後得到的results,會回傳包含object(一筆資料一個object)的Array,像這樣:

[{ id: 11,
  name: 'test2',
  comment: 'TEST!!!!!!',
  time: '2013-06-09 12:39:47' },
.......]


完成上方兩個部分(part1 + part2 )之後,接下來就下node mysql_practice.js

[root@XXXX /opt/local/share/httpd/htdocs/miblog]# node mysql_practice.js
[ { id: 14, name: 'Win Wu', comment: '', time: '' },
  { id: 18, name: 'Win Wu', comment: '', time: '' },
  { id: 3,
    name: 'this is new nam',
    comment: 'yukyukyk',
    time: '0000-00-00 00:00:00' },
  { id: 4,
    name: 'ykyuk',
    comment: 'yukyukyk',
    time: '0000-00-00 00:00:00' },
  { id: 5,
    name: 'ykyuk',
    comment: 'yukyukyk',
    time: '0000-00-00 00:00:00' },
......(下方省略)
]



新增筆數
在這裡我就不再贅述上面的Part1資料庫連線方式,

這個範例是當我只想新增欄位的name,如果成功就會回傳被新增的id是多少,
當然我只設定name的值,所以這筆資料新增的時候,comment跟time的欄位就會變成空值。
connection.query('INSERT INTO ' + TABLE +' ' +'SET name = ?',['Win Wu']
    function(err,result){
       console.log(result.insertId);
   }
);



那如果我是要新增所有欄位的資料呢?
connection.query('INSERT INTO ' + TABLE +' SET name=?, comment=?, 
time=NOW()',['test2','TEST!!!!!!'],function(err, result){
  console.log(result.insertId);
});


Tip: 如何寫入現在的時間? ==> NOW()會寫入現在時間。


也可以這樣子寫:
connection.query('INSERT INTO ' + TABLE +
 '(name, comment, time) ' + 'values(?,?,NOW())',
['This is name','This is test Comment']);





刪除某一筆資料
已刪除id為25的資料為例。
connection.query('DELETE FROM ' + TABLE +
 ' WHERE id = ? ',[25] ,function(err, result){
  if(err){
    console.log(err);
  }else{
  console.log(result.affectedRows);
  }
});



更新某筆資料的欄位內容

已更新id為24的name欄位為'this is new name'為例

connection.query('UPDATE ' + TABLE + ' SET ' 
'name=? WHERE id=?',['this is new name',24],function (err,result){
  if(err){
    console.log(err);
  }else{
    console.log(result.affectedRows);
  }
});




最基本的操作,大概就是這樣,應該足夠我應付要完成留言板的作業XD



參考:



Learning Node - O'REILLY出版 - chapter11(The Node Relational Database Bingings)

沒有留言:

張貼留言

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...