You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已部署Hyperledger Fabric网络,如何将Web/React应用连接至JavaScript链码?

如何将React应用连接到Hyperledger Fabric JavaScript链码

你已经完成Fabric网络和链码部署,接下来要实现React前端与链码的交互,核心思路是通过Node.js中间层API中转(浏览器无法直接调用Fabric的gRPC接口),具体步骤如下:

1. 搭建Node.js中间层API

初始化项目并安装依赖

mkdir fabric-api && cd fabric-api
npm init -y
npm install express cors fabric-network @hyperledger/fabric-ca-client

编写API核心逻辑

创建server.js,实现链码的查询与提交交易接口:

const express = require('express');
const cors = require('cors');
const { Gateway, Wallets } = require('fabric-network');
const path = require('path');

const app = express();
app.use(cors());
app.use(express.json());

// 加载Fabric连接配置和钱包路径
const ccpPath = path.resolve(__dirname, '..', 'test-network', 'organizations', 'peerOrganizations', 'org1.example.com', 'connection-org1.json');
const walletPath = path.join(process.cwd(), 'wallet');

// 查询链码数据接口
app.get('/api/query', async (req, res) => {
    try {
        const gateway = new Gateway();
        await gateway.connect(ccpPath, {
            wallet: await Wallets.newFileSystemWallet(walletPath),
            identity: 'user1', // 替换为你的测试用户身份
            discovery: { enabled: true, asLocalhost: true }
        });

        const network = await gateway.getNetwork('mychannel'); // 替换为你的通道名称
        const contract = network.getContract('mychaincode'); // 替换为你的链码名称

        // 调用链码查询方法,替换为你实际的链码方法名
        const result = await contract.evaluateTransaction('queryAllAssets');
        res.json(JSON.parse(result.toString()));
        await gateway.disconnect();
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

// 提交链码交易接口
app.post('/api/submit', async (req, res) => {
    try {
        const gateway = new Gateway();
        await gateway.connect(ccpPath, {
            wallet: await Wallets.newFileSystemWallet(walletPath),
            identity: 'user1',
            discovery: { enabled: true, asLocalhost: true }
        });

        const network = await gateway.getNetwork('mychannel');
        const contract = network.getContract('mychaincode');

        // 调用链码提交方法,替换为你实际的方法名和参数
        const result = await contract.submitTransaction('createAsset', req.body.id, req.body.value);
        res.json({ message: '交易提交成功', result: result.toString() });
        await gateway.disconnect();
    } catch (error) {
        res.status(500).json({ error: error.message });
    }
});

app.listen(3001, () => {
    console.log('Fabric API服务运行在http://localhost:3001');
});

导入测试用户身份到钱包

进入test-network目录,将测试用户身份导入本地钱包:

cd test-network
# 生成user1身份材料并导入钱包(可复用测试网络脚本)
./scripts/createPeerAdminCard.sh
# 若脚本不适用,可参考Fabric官方示例编写Node.js脚本导入身份

2. React前端调用API

在React项目中安装请求工具

npm install axios

编写React组件示例

创建FabricAsset.js组件,实现数据查询和交易提交:

import React, { useState, useEffect } from 'react';
import axios from 'axios';

const FabricAsset = () => {
    const [assets, setAssets] = useState([]);
    const [assetId, setAssetId] = useState('');
    const [assetValue, setAssetValue] = useState('');

    // 页面加载时查询链码数据
    useEffect(() => {
        axios.get('http://localhost:3001/api/query')
            .then(res => setAssets(res.data))
            .catch(err => console.error(err));
    }, []);

    // 提交交易并刷新数据
    const submitTransaction = () => {
        axios.post('http://localhost:3001/api/submit', {
            id: assetId,
            value: assetValue
        })
        .then(res => {
            alert(res.data.message);
            axios.get('http://localhost:3001/api/query').then(res => setAssets(res.data));
        })
        .catch(err => console.error(err));
    };

    return (
        <div>
            <h2>Fabric资产列表</h2>
            <ul>
                {assets.map(asset => (
                    <li key={asset.ID}>{asset.ID}: {asset.Value}</li>
                ))}
            </ul>
            <div>
                <input 
                    type="text" 
                    placeholder="资产ID" 
                    value={assetId} 
                    onChange={(e) => setAssetId(e.target.value)} 
                />
                <input 
                    type="text" 
                    placeholder="资产值" 
                    value={assetValue} 
                    onChange={(e) => setAssetValue(e.target.value)} 
                />
                <button onClick={submitTransaction}>创建资产</button>
            </div>
        </div>
    );
};

export default FabricAsset;

3. 关键注意事项

  • 跨域配置:确保Node.js后端启用CORS,避免React前端请求被浏览器拦截
  • 网络访问:后端服务器需要能访问Fabric节点的gRPC端口(默认7051),测试环境下确认端口未被防火墙拦截
  • 身份安全:所有Fabric身份信息(密钥、证书)仅保存在后端,前端通过API间接交互,绝不暴露敏感信息
  • 链码方法匹配:确保API中调用的链码方法名、参数与你部署的JavaScript链码完全一致

内容的提问来源于stack exchange,提问作者MD. MOHIMUL ALAM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:30:16