Node.js 模組(五)

行程與執行緒  Process & Threads

執行外部命令

這是最常被需要的功能之一,因為往往我們需要執行額外的應用程式或是命令,來協助我們完成工作。為達到這個功能,引入Node.js內建的child_process核心模組,然後/使用它的exec()方法即可。

var child_process = require('child_process');

//執行命令 ls -lh /usr
child_precess.exec('ls -lh /usr', function(err, stdout, stderr)
{
if (err) {
throw err;
return;
}
console.log(stdout);
});

Node.js 模組(四)

資料庫  DataBase

MySQL

npm install mysql

建立資料庫連線

一旦裝好mysql模組之後,就可以使用createConnection()建立一個新連線,並設定資料庫主機位置、帳號、密碼。最後再以connect()方法開始進行連線。

範例

var mysql = require('mysql');

//建立連線,並設定主機位置、帳號、密碼
var connection = mysql.createConnection( {
host: 'localhost',
user: 'fred',
password: 'fred1234'
});

//開始連線
connection.connect(function(err) {
if (err)
throw err;

//印出連線成功訊息
console.log('Connection');

//關閉連線
coonection.end();
});

查詢資料

MySQL支援了SQL的表達式,我們可以直接下達SQL語法進行資料查詢。

var mysql = require('mysql');

//建立連線,並設定主機位置、帳號、密碼
var connection = mysql.createConnection( {
host: 'localhost',
user: 'fred',
password: 'fred1234'
});

//開始連線
connection.connect(function(err) {
if (err)
throw err;

var sql = 'Select * from myTable';
connection.query(sql, function(err, rows) {
if (err)
throw err;
//印出查詢結果
console.log(rows);
//關閉連線
connectuin.end();
});
});

帶入條件查詢

var mysql = require('mysql');

//建立連線,並設定主機位置、帳號、密碼
var connection = mysql.createConnection( {
host: 'localhost',
user: 'fred',
password: 'fred1234'
});

//開始連線
connection.connect(function(err) {
if (err)
throw err;
var sql = 'select * from myTable where name=? and age=?';
var params = ['Fred', 29];
connection.query(sql, params, function(err, rows) {
if (err)
throw err;
console.log(rows);
connection.end();
});
});

MongoDB   

MongoDB是由10gen團隊在2007年10月所發展,2009年2月首度推出。表面上,MongoDB是用JavaScript開發者最孰悉的JSON格式儲存資料,對JavaScript的使用者來說,操作上和使用概念都相當易懂。
嚴格說,MongoDB內部是用BSON的格式儲存資料,將JSON資料轉成Binnary的形式處理,所以BSON即為Binary JSON的意思。這樣做可以加速內部資料處裡效能,也能更易於管理記憶體和硬碟空間的使用。

安裝MongoDB驅動程式

npm install mongodb

建立連線

var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;

//連接MongoDB
MongoClient.connect=('mongodb://localhost/test', function(err, db) {

//選擇資料表 contact
db.collection('contact', function(err, collection) {

//取得 contact資料表所有資料
collection.find({}, function(err, rows) {

//印出 contact資料表裡所有的資料
for (var index in rows)
console.log(rows[index]);
});
});
});

而URI的格式如下,我們亦可以設定MongoDB的帳號及密碼,以及指定port的號碼:

語法如下:

mongodb://[username]:[password]@[host]:[port]/[database]

插入新資料

collection.insert(docs[, options], callback)
collection.insert({
name: 'Fred',
tel: '0912345XXX',
address: 'Taipei'
}, function(err, docs) {
if (err) {
throw err;
return;
}
console.log('Insert data sucess');
});

⬆目前測試有問題:

問題是:沒有test的資料庫,也沒有contact的資料表,執行connect、insert 不會出現錯誤。

Node.js 模組(三)

數學計算  Mathematics

模組  Math.js

JavaScript 和 Node.js 內建原生的數學計算方法,只有基本功能而已,如果想要有更有複雜的數學方法解決方案,可以考慮使用Math.js。Math.js提供非常多的數學方法,而且提供更彈性化的運算操作。

npm install mathjs

檔案系統  File system      fs

Node.js內建一個fs核心模組供開發人員進行檔案I/O的操作

var fs = require('fs');

非同步方法讀取目錄檔案清單

var fs = require('fs');

fs.readdir('../exercise', function(err, files) {

if (err) {
console.log(err);
return;
}
for (var index in files) {
console.log(files[index]);
}
});

檢查檔案是否存在

var fs = require('fs');

fs.exists('/tmp', function (exists) {
//印出結果,如果存在為true,如果失敗為false
console.log(exists);
});

刪除檔案

var fs = require('fs');

fs.unlink('/tmp/test', function(err) {
//如果有錯誤發生
if(err) {
console.log(err);
return;
}
console.log('Removed');
});

刪除目錄

rmdir()
即可刪除一個指定檔案,但是這只能刪除一個空的目錄,如果我們想刪除的是一個有許多檔案的目錄,就必須先遍歷整個目錄,將其中所有的檔案一層層清空最後再進行目錄刪除。

解決這個問題我們可以用fs-extra模組
npm install fs-extra

變更檔案名稱

var fs = require('fs');

fs.rename('/tmp/test', '/tmp/test.new', function (err) {
if(err) {
console.log(err);
return;
}
console.log('Renamed');
});

非同步讀取檔案內容

var fs = require('fs');

fs.readFile('./readfile.js', function(err, data) {
if (err) {
console.log(err);
return;
}
console.log(data.toString());
});

以資料流形式讀取檔案

Node.js本身有良好的資料流(Steam)支援,使用資料流可以很有效率的處理I/O的資料,然後我們就像水龍頭接水一樣,接者從水管流出的資料,然後再進行處理。
Node.js的fs核心模組有提供一個createReadStream()方法

var fs = require('fs');

var stream = fs.createReadSrteam('/readfile-stream.js');

stream.on('data', function(data) {
console.log(data.toString());
});

非同步寫入檔案內容

var fs = require('fs');

fs.writeFile('./writefile.txt', 'Hello World', function(err) {
if (err) {
console.log(err);
return;
}
console.log('Wrote');
});

以資料流形式寫入檔案

var fs = require('fs');

var stream = fs.createWriteStream('./writefile-stream.txt');
stream.write('Hello World');

附加資料到檔案內容結尾

var fs = require('fs');

fs.appendFile('./appendfile.txt', 'Hello World', function (err){
if (err) {
console.log(err);
return;
}
console.log('Appended');
});

搬移檔案

搬移檔案或複製檔案,就是在指定的路徑上建立一個新的空白檔案,然後把被複製的檔案內容,複製寫入到這個新的空白檔案之中,這只是運用到前面的讀取、寫入的技巧和功能。

原生的fs沒有完整的功能,我們可以用第三方模組 fs-extra來完成這個工作。

npm install fs-extra

var fse = require('fs-extra');
fse.move('./tmp/src.txt', './tmp/dest.txt', function(err) {
if (err) {
console.log(err);
return;
}
console.log('Move');
});