Node.js

解決問題 Node.js (1)

教學目標

在 Ubuntu 作業系統上無痛升級 Node.js 至 6.x 版本。

重點概念

最近發現部落格文章難以檢索,所以想將 Hexo 套件所建立的部落格加上搜尋功能,卻遇到 Strict Mode 嚴格模式無法進行編譯,所謂 Strict Mode 嚴格模式是 ECMAScript 5 中的新功能,其優點為協助找出程式碼中常見可能導致問題的不良語法,以及關閉了容易造成混洧或誤用的語法。

此時想到可能是 Node.js 的版本為 0.10.3 已經有將近二年未更新,所以導致上述Strict Mode 嚴格模式不支援而無法編譯的問題,因此透過官方網站的文章,在 Ubuntu 作業系統中完成無痛更新。

安裝 Node.js 6.x 儲存庫

1
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -

安裝 Node.js 和 NPM

1
$ sudo apt-get install -y nodejs

總結現今有越來越多的 Node.js 套件已經開始強制開啟 Strict Mode 嚴格模式,因此舊版本的 Node.js 必須要升級至 Node.js 6.x 才能夠正常使用 Node.js 套件。

相關資源

LINE BOT 實作筆記 (1)

教學目標

初步了解如何在 Mac OS 中透過 Azure 雲端服務建立 LINE Bot。

重點概念

步驟一: 申請 LINE Messaging API 開發帳號密碼。
步驟二: 安裝 Azure CLI 工具。

1
2
$ curl -L https://aka.ms/InstallAzureCli | bash
$ exec -l $SHELL

步驟三: 安裝 Node.js 工具。
步驟四: 下載 Azure 範本 (Node.js)。
步驟五: 執行 Node.js Web 應用程式。

1
2
3
4
$ git clone https://github.com/Azure-Samples/nodejs-docs-hello-world
$ cd nodejs-docs-hello-world
$ npm start
$ node index.js

步驟六: 測試 Node.js Web 應用程式。

1
http://localhost:1337

步驟七: 建立 Azure App 網站服務 (免費)。

1
2
3
4
5
$ az group create --name leoyeh --location westeurope
$ az appservice plan create --name quickStartPlan --resource-group leoyeh-me --sku FREE
$ az appservice web create --name leoyeh-me --resource-group leoyeh-me --plan quickStartPlan
$ az appservice web config update --linux-fx-version "NODE|6.9.3" --startup-file process.json --name leoyeh-me --resource-group leoyeh-me
$ az appservice web source-control config-local-git --name leoyeh-me --resource-group leoyeh-me --query url --output tsv

步驟八: 撰寫 LINE Bot 的接收與回應基本程式應用。

1
$ vi index.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
const secret = "您的 Channel Secret";
const id = "您的 Channel ID";
var http = require('http');
var bodyParser = require('body-parser');
var express = require('express');
var request = require('request');

var port = process.env.port || 1337
var app = express();
app.use(bodyParser.json());

// 接聽來自Line伺服器中的訊息
app.post('/callback', function (req, res) {
console.log('callback: ', req.body);
var result = req.body.events;
for(var i=0; i < result.length; i++){
var data = result[i].message;
console.log('message content: ', data);
var message_data = '不是很了解您想問什麼耶~'
if (data.text.toLowerCase().indexOf('who')>-1 || data.text.indexOf('誰')>-1) message_data = '我名叫葉心寬,英文名字為 Leo Yeh,目前任職於國泰世華銀行核心系統部數據管理科的資訊人員,謝謝~';
else if (data.text.toLowerCase().indexOf('job')>-1 || data.text.indexOf('工作')>-1) message_data = '我在國泰世華銀行核心系統部2年,歐酷網路研究開發部門1年,以及台灣微軟行銷暨營運部門實習1年,工作經驗總計3年以上';

options = {
method: 'POST',
uri: 'https://api.line.me/v2/bot/message/reply',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer 您的 Access Token',
},
body: {
replyToken: result[i].replyToken,
messages: [{
type: 'text',
text: message_data,
}],
},
json: true,
}
request(options);
}
res.sendStatus(200);

});
http.createServer(app).listen(port);

步驟九: 安裝 Node.js 網站應用程式相關套件。

1
2
3
$ npm install express --save
$ npm install request --save
$ npm install body-parser --save

步驟十: 發佈 LINE Bot 程式碼至 Azure App 網站服務。

1
2
3
4
$ git remote add azure https://leoyeh@leoyeh-me.scm.azurewebsites.net/leoyeh-me.git
$ git add .
$ git commit -m "initial commit"
$ git push azure master

步驟十一: 設定 LINE Bot 的 Webhook URL,並且進行驗證。

1
https://leoyeh-me.azurewebsites.net/callback

步驟十二: 測試 LINE Bot,透過以下網址查看程式執行結果與記錄。

1
https://leoyeh-me.scm.azurewebsites.net/api/logstream

相關資源

Node.js 教學 - 文章列表

設計規範

透過設計規範在一定程度上約束 Node.js 開發者,使其於團隊中撰寫出可讀性高且易維護的程式碼。

資料處理

透過 underscore.js 套件進行文章中字元數的計算,主要以 MapReduce 的概念進行實作。
透過 brain 套件進行類神經網路的機器學習,根據使用者的看劇行為資料進行性別的分類。

檔案處理

透過 fast-csv 套件進行 CSV 檔案讀取與寫入的基本操作。
透過 jsonfile 套件進行 JSON 檔案讀取與寫入的基本操作。
透過 crawler 套件進行網頁檔案的多層分析,取出需要的資訊。

API 處理

透過 express 套件實作出最基本的 API 。
透過 express 套件進行 API 參數傳遞。
透過 koa 套件快速建立 API。

資料庫處理

透過 mysql 套件進行 MySQL 資料庫的基本操作。
透過 mongodb 套件進行 MongoDB 資料庫的基本操作。

快取處理

透過 memcached 套件進行快取讀取與寫入的基本操作。
透過 redis 套件進行快取讀取與寫入的基本操作。

例外處理

透過 Node.js 進行例外處理。

測試處理

透過 mocha 套件進行 Node.js 程式碼的單元測試。
透過 supertest 套件進行 Node.js API 的規格測試。
透過 loadtest 套件進行 Node.js API 的負載測試。

佈建處理

透過 Ubuntu 作業系統安裝 Node.js。
透過 forever 套件佈建 Node.js 伺服器,當發生異常終止和檔案變更時就會自動重新啟動。
透過 pm2 套件佈建 Node.js 伺服器,在重新開機時自動啟動伺服器。

即時處理

透過 sails 套件快速建立即時處理的 API。
透過 sails 套件自動產生搭配資料庫基本操作的即時處理 API 。

機器處理

透過 selenium-webdriver 套件進行瀏覽器機器人操作。

自動處理

透過 fixmyjs 套件根據 JSHint 自動修復程式碼。
透過 yeoman 套件統整專案開發流程,減少重複的工作專注在於專案的架構與設計。
透過 strongloop 套件快速建立 API,同時產生管理平台。

模組處理

透過 Node.js 進行模組使用和定義。

記錄處理

透過 log4js 套件實作出每日的 API 存取記錄檔。

協調處理

透過 async 套件在多個非同步事件處理進行協調。(以基本資料處理為例。)
透過 co 套件在多個非同步事件處理進行協調。(以取得劇集資訊為例。)

加密處理

透過 crypto 套件進行資訊驗證。

推播處理

透過 apn 套件進行 iOS 的推播服務的通知。
透過 node-gcm 套件進行 Android 的推播服務的通知。
透過 nodemailer 套件進行信件寄送的通知。

圖表處理

透過 c3.js 套件實作圖表,呈現不同類型 App 產品的每天活躍使用者資訊。
透過 chart.js 套件實作圖表,比較 App 產品的本週與上週活躍使用者資訊。
透過 highcharts 套件實作圖表,呈現看劇的男生和女生比例資訊。
透過 charted 開源碼專案實作自動產生圖表網站服務,呈現廣告投放成效基本資訊。
透過 polymer 開源碼專案之 google chart 套件呈現 iOS App 使用分析的比例圖表。
透過 plotly.js 套件產生與管理線上圖表,呈現不同類型 App 產品的每天活躍使用者資訊。
透過 ECharts 套件實作圖表,呈現不同類型 App 產品的每天活躍使用者資訊。

廣告處理

透過 co-request 套件存取 Facebook 的 Reporting API 取得當日廣告版位相關資訊。
透過 co-request 套件存取 App Annie 的 Data API 取得當日廣告版位相關資訊。

同步處理

透過 co-express 套件同步存取 App Store 的 RSS Feed Generator 的 API 匯整任何 App 的排名資訊。
透過 memcached 套件撰寫即時同步計數 API 伺服器,主要存取 Memcached 分散式伺服器。

網站應用

透過 passport 套件進行身份認證的網站應用。
透過 hexo 套件建立部落格的網站應用。

排序處理

透過 Node.js 實作資料結構與演算法中的氣泡排序法。
透過 Node.js 實作資料結構與演算法中的插入排序法。
透過 Node.js 實作資料結構與演算法中的希爾排序法。

圖的處理

透過 Node.js 實作深度優先搜尋找出圖元件中所有節點。
透過 Node.js 實作廣度優先搜尋找出圖元件中所有節點。

函數處理

透過 Node.js 實作 Higher Order Function 的應用,提供每秒執行重複事項的函式,總共 N 次。
透過 Node.js 實作 Map 、 Filter 和 Reduce 函式的應用,找出所有活動票價中小於 1000 元的最高票價。

前端處理

透過 Node.js 實作 API ,並且與前端 Angularjs 框架進行資料處理。
透過 Node.js 實作 API ,並且與前端 Angularjs 框架進行表單處理。

雲端部署

透過 IBM Bluemix 進行 Node.js 應用程式的雲端部署。
透過 AWS Elastic Beanstalk 進行 Node.js 應用程式的雲端部署。
透過 MEAN development stack on Google Compute Engine 進行 Node.js 應用程式的雲端部署。

雲端服務 - Parse

透過 Node.js 實作 RESTful API 主要能夠彈性存取 Parse 雲端服務的資料庫。

雲端服務 - IBM

透過 Node.js 分析文章所代表的使用者輪廓,並且產生分析 API (IBM Watson 雲端服務)。
透過 Node.js 分析文章所使用的語言,並且產生分析 API (IBM Watson 雲端服務)。

雲端服務 - Google

透過 Node.js 進行 Google BigQuery 資料的查詢應用。
透過 Node.js 進行 Google BigQuery 資料的新增應用。
透過 Node.js 進行 Google BigQuery 資料的轉換應用。
透過 Node.js 進行 Google BigQuery 資料的進階查詢應用。
透過 Node.js 進行 Google BigQuery 資料的讀取匯入應用。

雲端服務 - Amazon

透過 Node.js 進行 Amazon DynamoDB 傳入和取出 JSON 格式的記錄。
透過 Node.js 進行 Amazon S3 上傳與下載 JSON 格式的檔案。
透過 Node.js 進行 Amazon SQS 上傳與下載 JSON 格式的檔案。
透過 Node.js 進行 Amazon Kinesis 傳入和取出 JSON 格式的記錄。
透過 Node.js 搭配 Amazon Elastic MapReduce 建立簡易的推薦 API 應用。
透過 Node.js 搭配 Amazon S3 雲端服務建立上傳圖片檔案的應用。

Node.js 雲端服務 - Parse (1)

基本介紹

教學目標

透過 Node.js 實作 RESTful API 主要能夠彈性存取 Parse 雲端服務的資料庫。

前置作業

  1. 申請 Parse 雲端服務帳號。
  2. 在 Core Data 服務中建立資料類別。

套件安裝

1
$ npm install parse --save

使用教學

實作重點

  1. 溝通介面: API 針對 Parse 雲端服務中的 Document 資料類別進行 CRUD 操作。
  2. 需求彈性: API 參數可以針對資料庫 Schema 直接進行彈性調整。
  3. 資料管理: Parse 雲端服務已經提供資料管理的平台,可以輕易透過網站進行資料的管理。
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
var express = require('express'); 
var body_parser = require('body-parser');
var app = express();

app.use(body_parser.json());
app.use(body_parser.urlencoded({ extended: true }));

var router = express.Router();

var Parse = require('parse').Parse;

Parse.initialize("Application ID", "JavaScript Key");

app.use('/api/v1', router);

router.get('/document', function(req, res){
var query = new Parse.Query("Document");
query.find({
success: function(document) {
var datas = [];
for (var i = 0; i < document.length; ++i) {
datas.push(document[i]);
}
res.json(datas);
}
});
});

router.post('/document', function(req, res){
var Document = Parse.Object.extend("Document");
var document = new Document();
var keys = Object.keys(req.body);
for (var n=0; n<keys.length; n++) {
document.set(keys[n],req.body[keys[n]]);
}
document.save(null, {
success: function(document) {
res.json(document)
},
error: function(document, error) {
console.log(error)
}
});
});

router.delete('/document', function(req, res){
var query = new Parse.Query("Document");
query.equalTo("objectId",req.body.objectId);
query.first({
success: function(document) {
document.destroy();
res.json(document);
},
error: function(document, error) {
console.log(error)
}
});
});

router.put('/document', function(req, res){
var query = new Parse.Query("Document");
query.equalTo("objectId",req.body.objectId);
query.first({
success: function(document) {
var keys = Object.keys(req.body);
for (var k=0; k<keys.length; k++) {
if (keys[k]!="objectId") {
document.set(keys[k],req.body[keys[k]]);
}
}
document.save();
res.json(document);
},
error: function(document, error) {
console.log(error)
}
});
});

var port = process.env.PORT || 8080;
app.listen(port);

相關資源

Node.js 同步處理 (2)

基本介紹

教學目標

透過 memcached 套件實作即時同步計數 API,透過 Apache Benchmark 工具進行驗證。

前置作業

  1. 完成 Node.js 套件安裝與設置。
  2. 啟動 Memcached 伺服器。
  3. 安裝 ApacheBench 工具。

套件安裝

1
$ npm install memcached --save

使用教學

透過 memcached 套件撰寫即時同步計數 API 伺服器,主要存取 Memcached 分散式伺服器。

server.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var Memcached = require('memcached');
var memcached = new Memcached('localhost:11211');
var express = require('express');
var app = express();

var lifetime = 86400000;

app.get('/api/v1/count', function(req, res){
var key = req.query.key;
memcached.incr(key, 1, function (err) {});
memcached.get(key, function (err, data) {
if (!data) {
memcached.set(key, 0, lifetime, function (err) {});
} else {
console.log(data);
res.json({value: data})
}
});
});

app.listen(8080);

執行 即時同步計數 API 伺服器。

1
$ node server.js

透過 Apache Benchmark 工具進行驗證。

1
$ ab -n 100000 -c 100 http://localhost:8080/api/v1/count?key=impression

相關資源