目標
搭建NodeJS後端框架 搭建前端web框架 前後端互動
前言
本課程是比特幣錢包開發,後端使用的NodeJS搭建,客戶端使用的web前端,VSCode開發工具,Ubuntu16.04系統(當然,Mac、windows系統也可以),node v8.11.3,npm v5.6.0。
一、前端架構
咱們的開發重點是在後端實現上,因此為了讓大家快速上手,web客戶端沒有使用其它流行的框架,這裡只使用了jQuery框架簡化程式碼,另外還有個jQuery Validate 外掛簡化了表單驗證。
web前端整體技術:
html + css + javascript + jQuery。
web前端功能:
錢包模組 建立錢包 助記詞匯入錢包 錢包列表 匯出錢包助記詞 賬號模組 查詢餘額 建立子賬號 查詢子賬號:地址、路徑、私鑰 比特幣轉賬 交易記錄
二、後端架構
這個錢包應用程式與比特幣區塊鏈互動,我們使用了Bitpay開發的bitcore-wallet-client庫,使用它便於我們的開發,封裝了比較全面的API給我們使用。
另外,後端Http框架使用的是強大的express,裡面封裝了很多功能,因為bitcore-wallet-client庫中提供的API會透過非同步callback返回資料,所以就不用koa。
在這個專案中使用了第三方庫較少,如下:
bitcore-wallet-client:是bitcore-wallet-service的客戶端庫,使用REST API 與BWS bitcore-wallet-service進行通訊,所有REST端點都包裝為簡單的非同步方法。bitcore-wallet-service庫實現了多重簽名的比特幣HD錢包服務,使用該服務的有Copay、Bitpay錢包。 express:是一個web框架,提供的HTTP伺服器工具非常強大,且整合與使用簡單,與koa類似。 ejs:是一種JavaScript模版引擎,可以動態的設定變數值到html。需要與模板渲染中介軟體koa-views配合使用。 整體架構使用了成熟的MVC架構。專案的入口是index.js檔案,對專案做了配置,將後端服務繫結到了3000埠並處於簡體狀態,當前端訪問服務時,router.js路由檔案根據URL將任務分配到controllers資料夾下的業務檔案中。
這裡為了讓快速上手開發比特幣錢包專案,前後端都在一個專案上同時開發,將前端的頁面檔案放在了static與views資料夾中,當然,同時支援移動端(iOS、安卓)的呼叫。若是需要前後端分離,可直接將static與views資料夾分離出來即可。
三、專案初始化
新建專案跟資料夾BTCWallet,然後按照如下步驟執行
新建專案跟資料夾BTCWallet,然後按照如下步驟執行
lixu@ubuntu:~$ cd '/home/lixu/Desktop/demo/BTCWallet/' lixu@ubuntu:~/Desktop/demo/BTCWallet$ npm init
然後不斷回車初始化專案。然後後自動生成package.json檔案,是專案包的配置檔案,下面我們引入專案中需要用到的庫,複製下面json到package.json檔案的最後一個欄位。
, "dependencies": { "bitcore-wallet-client": "^6.7.5", "ejs": "^2.6.1", "express": "^4.16.4" }
專案的介面如下:
然後執行以下命令按照上面的依賴庫。
npm install
下載完成後會將所有的依賴庫下載到專案根目錄自動新建的node_modules資料夾。
四、專案原始碼
按照如下結構搭建專案。
index.js
專案的入口檔案。首先例項化express物件,然後將express.urlencoded、ejs、views、static路由註冊到中介軟體,服務繫結到3000埠。
各字斷含有:
BWS_URL: bitcore-wallet服務端地址,我們使用的是bitpay的地址,你也可以自己搭建一個錢包服務端。
networkType: 錢包連線的網路型別,支援正式網路和測試網路,分別表示為:livenet、testnet。
coinType: 幣種型別,支援比特幣和比特幣現金,分別表示為:btc、bch。
copayerName: 錢包的擁有者,建立錢包的一個必填字斷,這裡我就指定為常量“lixu”。
walletFilePath: 建立錢包後匯出的檔案的存放位置。
Models/walletClient.js
出來wallet的model檔案,這裡只有一個方法,例項化bitcore-wallet客戶端。
let config = require("../config/config")
module.exports = {
getWalletClient: () => {
var Client = require('bitcore-wallet-client');
var client = new Client({
baseUrl: config.BWS_URL,
verbose: false,
});
return client
},
}
router/router.js
路由檔案。
let router = require('express').Router();
router.get("/wallet.html", (req, res) => {
res.render("wallet.html");
})
module.exports = router
utils/myUtils.js
專案工具類,提供返回給前端成功與失敗的基本資料結構、判斷字串是否以某個字串結尾。
參考資料
express的github:https://github.com/expressjs/express
ejs的github:https://github.com/tj/ejs
bitcore-wallet-client的github:https://github.com/bitpay/bitcore-wallet-client