基于区块链的云笔记小程序开发(二)

接着上一步骤,继续开发

 

 

今天任务:

  1. 搭建node服务端并启动node服务
  2. 利用postman进行接口测试

 

1. 搭建node服务端

1.1 首先,在本地安装nodejs:https://nodejs.org/en/

这里最好下载10.x.x稳定版本

装好之后,打开终端terminal,输入命令查看是否成功安装:

node -v

显示v10.x.x,则说明安装成功。

 

1.2 node服务端初始化

在桌面新建文件夹blockchain,用来初始化node服务端

打开终端terminal,进入到blockchain,输入下面命令进行初始化

npm init

后面的步骤一直回车(enter)即可

此时,在文件夹blockchain中会生成package.json文件

通过终端terminal进入blockchain,再通过npm(node自带的包管理工具)下载需要的模块:

npm install request-promise --save
npm install web3@1.0.0-beta.46 --save

⚠️逐条执行

待成功装完之后,在 blockchain 中会生成node_modules文件夹和package_lock.json文件,node_module里面放的都是项目需要用到的相应模块

 

1.3 在blockchain中新建router.js、server.js和requestHandler.js三个文件

此时整个blockchain文件夹目录结构如下:

  • node_modules
  • index.js:node服务端入口,负责资源映射
  • package-lock.json:项目需要用到的所有依赖包
  • package.json:初始化文件
  • router.js:判断路由
  • server.js:进行http请求
  • requestHandler.js:通过web3与私有链进行交互

 

1.4 启动node服务

用vscode打开blockchain(开发工具随意,这里我用的是vscode)

打开vscode内置的控制台:Terminal -> New Terminal

输入命令,启动node服务:

node index.js

没报错的话,就可以开始测试接口了

 

2. 利用postman进行接口测试

requestHandler.js中,主要方法如下:

//测试
function test(body) {
    return 'result';
}

//创建账户
async function newAccount(body) {
    var account = "account";
    // console.log(body.password);
    await web3.eth.personal.newAccount(body.password, function (error, data) {
        console.log("创建的新账户地址:" + data)
        account = data;
    });
    sendToAccount(account, '10');
    return account;
}

//转账给用户
async function sendToAccount(account, amount) {
    var result =await unlockAccount(adminAccount, adminPassword);
    if (result) {//解锁管理员账户
        web3.eth.sendTransaction({
            from: adminAccount,
            to: account,
            value: web3.utils.toWei(amount)
        }, function (error, data) {
            console.log("交易的hash值:" + data);
        });
    }
}

//解锁账户
async function unlockAccount(account, password) {
    var result = false;
    await web3.eth.personal.unlockAccount(account, password, 300, function (error, data) {
        console.log(account + "解锁结果:" + data);
        result = data;
    });
    return result;
}

//部署合约方法的转发,因为没有返回值,server.js中会报错
async function deploy(body) {
    var account = body.account;
    var password = body.password;
    console.log(account);
var address = await deployContract(account); console.log("address:"+address); return {'contractAddress':address}; } //部署合约 function deployContract(account) { return new Promise(function (resolve, reject) { bn.deploy({ data: bytecode }).send({ from: account, gas: 3000000, gasPrice: '300000000000' }, function (error, data) { //data:交易的哈希值 console.log(error); console.log(data); }).on('receipt', function (receipt) { console.log('合约的地址:' + receipt.contractAddress) // contains the new contract address //contractAddress = receipt.contractAddress;//TODO 异步的问题 resolve(receipt.contractAddress); }); }); //return contractAddress; } //添加笔记 async function addNote(body) { var title = body.title; var desc = body.desc; var content = body.content; var account = body.account; var password = body.password; var date = getNowFormatDate(); var id = web3.utils.sha3(new Date().getTime() + title + desc + content); var contractAddress = body.contractAddress; var result = await unlockAccount(account, password); if (result) {//解锁当前用户的以太坊账户 bn.options.address = contractAddress; bn.methods.addNote(date, id, title, desc, content).send({ from: account }, function (error, data) { //data:调用方法之后的返回值 return 'success'; }); } } //获得笔记列表 async function getNoteList(body) { var date = body.date; var count = body.count; var account = body.account; var password = body.password; var contractAddress = body.contractAddress; var result = await unlockAccount(account, password); if (result) {//解锁当前用户的以太坊账户 bn.options.address = contractAddress; bn.methods.getNodeList(date, count).call({ from: account }, function (error, data) { //data:调用方法之后的返回值 }); } } //获得一个笔记 async function getNote(body) { var date = body.date; var id = body.id; var account = body.account; var password = body.password; var contractAddress = body.contractAddress; var result = await unlockAccount(account, password); if (result) {//解锁当前用户的以太坊账户 bn.options.address = contractAddress; bn.methods.getNode(date, id).call({ from: account }, function (error, data) { //data:调用方法之后的返回值 }); } } //获取当前时间,格式YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var year = date.getFullYear(); var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = year + seperator1 + month + seperator1 + strDate; return currentdate; } exports.test = test; exports.newAccount = newAccount; exports.deploy = deploy; exports.addNote = addNote; exports.deployContract = deployContract;

测试之前,记得先启动私有链!!

关于如何启动私有链,这里不再说明,具体可查看上一篇随笔

接下来就可以打开postman进行接口的测试了:

test方法:

 

newAccount:

 

deploy:(核心方法)

⚠️测试deploy方法需要传account(账户)和password(密码)

且必须保证account(账户)是有以太币的,否则会报错

 

addNote:

⚠️addNote需要传的参数还是挺多的,除了基本的title、desc和content之外,

还必须传账户和密码,用于解锁账户,才能进行添加笔记操作。

当然,最重要就是contractAddress这一参数了,是合约地址。

合约地址的对错,直接影响后面的函数的调用情况

调用addNote方法必须要启动私有链并开启挖矿

 

getNodeList:

 

 未完待续~

posted @ 2019-05-30 10:34  misitexue  阅读(897)  评论(1)    收藏  举报