区块链食品溯源案例实现(二)

引言

        随着前端界面的完成,我们接下来需要编写后端代码来与区块链网络进行交互。后端将负责处理前端发送的请求,调用智能合约的方法获取食品溯源信息,并将结果返回给前端。

通过前后端的整合,我们可以构建一个食品溯源系统,为用户提供便捷、安全的食品查询服务。

目录

引言

后端代码实现

安装依赖

首先,确保已经安装了Node.js和npm。然后,在项目根目录下执行以下命令安装依赖:

创建后端服务器

在项目根目录下创建一个名为server.js的文件,并编写以下代码:

配置环境变量

在项目根目录下创建一个名为.env的文件,并添加以下环境变量:

启动后端服务器

在项目根目录下执行以下命令启动后端服务器

修改前端代码中的请求地址

启动前端项目并测试

在前端项目根目录下执行以下命令启动前端项目:

总结



后端代码实现

  • 在本文中,我们将使用Node.js和Express框架来编写后端代码。同时,我们继续使用Web3.js库与区块链网络进行交互。
安装依赖
  • 首先,确保已经安装了Node.js和npm。然后,在项目根目录下执行以下命令安装依赖:
npm install express body-parser web3 dotenv

  • 其中,express用于构建Web服务器,body-parser用于解析前端发送的请求体,web3用于与区块链网络进行交互,dotenv用于加载环境变量。
  • 创建后端服务器
  • 在项目根目录下创建一个名为server.js的文件,并编写以下代码:
require('dotenv').config();  
const express = require('express');  
const bodyParser = require('body-parser');  
const Web3 = require('web3');  const app = express();  
app.use(bodyParser.json());  // 初始化Web3对象  
const web3 = new Web3(Web3.givenProvider || process.env.BLOCKCHAIN_PROVIDER);  // 连接到区块链网络(这里以本地开发环境为例)  
const contractAddress = process.env.CONTRACT_ADDRESS;  
const abi = JSON.parse(process.env.CONTRACT_ABI);  
const foodTraceabilityContract = new web3.eth.Contract(abi, contractAddress);  // 定义路由处理函数  
app.get('/food/:id', async (req, res) => {  try {  const foodId = req.params.id;  const foodInfo = await foodTraceabilityContract.methods.getFoodInfo(foodId).call();  res.json(foodInfo);  } catch (error) {  console.error(error);  res.status(500).json({ message: 'Error fetching food info' });  }  
});  // 启动服务器  
const port = process.env.PORT || 3001;  
app.listen(port, () => {  console.log(`Server is running on port ${port}`);  
});

  • 在上面的代码中,我们首先使用dotenv加载环境变量,这些环境变量包括区块链网络的提供商地址、智能合约的地址和ABI等。
  • 然后,我们创建了一个Express应用,并使用了body-parser中间件来解析请求体。接下来,我们初始化了Web3对象,并连接到区块链网络。
  • 最后,我们定义了一个路由处理函数/food/:id,用于处理前端发送的食品信息查询请求。
  • 在该函数中,我们根据请求中的食品ID调用智能合约的getFoodInfo方法获取食品信息,并将结果以JSON格式返回给前端。

配置环境变量

  • 在项目根目录下创建一个名为.env的文件,并添加以下环境变量:
BLOCKCHAIN_PROVIDER=YOUR_BLOCKCHAIN_PROVIDER  
CONTRACT_ADDRESS=YOUR_CONTRACT_ADDRESS  
CONTRACT_ABI=YOUR_CONTRACT_ABI


  • YOUR_BLOCKCHAIN_PROVIDER替换为你的区块链网络提供商地址(例如,本地开发环境的HTTP提供商地址),YOUR_CONTRACT_ADDRESS替换为你的智能合约地址,YOUR_CONTRACT_ABI替换为你的智能合约ABI的JSON字符串。
  • 启动后端服务器
  • 在项目根目录下执行以下命令启动后端服务器
node server.js

服务器将在指定的端口(默认为3001)上启动,并等待前端发送请求。

  • 现在,我们已经完成了前后端的编写和配置。
  • 接下来,我们需要将前端与后端进行整合,并进行测试。
修改前端代码中的请求地址
  • 在前端代码中,我们需要将请求地址修改为后端服务器提供的地址。
  • 打开src/FoodTraceability.js文件,找到发送请求的部分,将请求地址修改为后端服务器的地址和端口。例如:
// 修改请求地址为后端服务器的地址和端口  
fetch(`http://localhost:3001/food/${foodId}`)  .then(response => response.json())  .then(data => {  // 处理后端返回的食品信息数据  console.log(data);  // 更新UI等操作...  })  .catch(error => {  console.error('Error fetching food info:', error);  });

确保将http://localhost:3001/food/${foodId}中的localhost:3001替换为你实际服务器的地址.

  • 启动前端项目并测试
  • 在前端项目根目录下执行以下命令启动前端项目:
npm start

  • 前端项目将在指定的端口上启动(默认为3000)。打开浏览器,访问前端项目的地址,并进行食品信息查询操作。如果一切正常,你应该能够看到后端返回的食品信息,并在前端界面上展示出来。

总结

        通过本文的介绍,我们实现了基于区块链的食品溯源系统的后端代码,并与前端进行了整合。后端负责处理前端发送的请求,调用智能合约获取食品溯源信息,并将结果返回给前端。前后端的协同工作使得用户可以通过前端界面方便地查询食品的生产信息、流通信息等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayList和LinkedList有什么区别?

ArrayList和LinkedList的区别 ArrayList 和 LinkedList 是 Java 中常用的两种集合类,它们都实现了 List 接口,但在内部实现和性能上有一些区别。 内部实现: ArrayList 使用数组实现,它的元素在内存中是连续存储的,每…

lua 获取指定路径下的所有文件夹

一、io.popen 函数获取 io.popen 是 Lua 中的一个函数,它允许你执行一个外部命令并将命令的输出作为流处理。如果你想在 Lua 中通过 io.popen 执行 dir 命令(linux 命令是ls )来获取指定文件夹下的所有文件及其路径,你可以构造一个适用于 Windows 环境下…

【C语言】linux内核pci_iomap

一、pci_iomap /** pci_iomap 是一个用于映射 PCI 设备的 BAR(Base Address Register,基地址寄存器)的函数。* 此函数返回指向内存映射 IO 的指针,用于直接访问 PCI 设备的内存或 I/O 空间。* * 参数:* dev - 指向pci_dev结构的指…

【微服务篇】深入理解资源隔离,限流,熔断原理(Hystrix、Resilience4j和Sentinel)

限流、降级和资源隔离是分布式系统设计中常用的三种技术手段,它们主要目的是增强系统的稳定性和可用性,尤其在高并发和不稳定网络环境下显得尤为重要 1.资源隔离的实现方式 资源隔离通常有两种主要的实现方式:线程池隔离和信号量隔离。 线…

JDK8的下载安装与环境变量配置教程

前言 官网下载:Java Archive Downloads - Java SE 8u211 and later 现在应该没人用32位的系统了吧,直接下载Windows x64 Installer jdk-8u391-windows-x64.exe 一、安装JDK 1. 打开jdk-8u391-windows-x64.exe 2. 直接下一步 3. 这个地方不要动他&…

servlet开发详解

一、什么是servlet,干什么用的??? tomcat作为一个web服务器,也称作servlet容器。servlet只有放在web服务器中才能运行,不能独立运行。tomcat这个容器要做三件事:接收请求、处理请求和响应请求。…

从根本上优雅地解决 VSCode 中的 Python 模块导入问题

整体概述: 在我尝试运行 test_deal_file.py 时,我遇到了一个 ModuleNotFoundError 错误,Python告诉我找不到名为 controllers 的模块。这意味着我无法从 deal_file.py 中导入 read_excel 函数。 为了解决这个问题,我尝试了几种方法…

【ML】类神经网络训练不起来怎么办 5

【ML】类神经网络训练不起来怎么办 5 1. Saddle Point V.S. Local Minima(局部最小值 与 鞍点)2. Tips for training: Batch and Momentum(批次与 动量)2.1 Tips for training: Batch and Momentum2.2 参考文献:2.3 Gradient Descent2.4 Concluding Remarks(前面三讲)3.…

【QT】:基本框架

基本框架 一.创建程序二.初识函数1.main2.Widget.h3.Wight.cpp4.Wight.ui5.文件名.pro 三.生成的中间文件 本系列的Qt均使用Qt Creator进行程序编写。 一.创建程序 二.初识函数 1.main 2.Widget.h 3.Wight.cpp 4.Wight.ui 此时再点击编辑,就看到了ui文件的本体了。…

Django query

QuerySet API 参考 该文档描述了 QuerySet API 的细节。它是建立在 模型 和 数据库查询 指南的材料基础上的,因此,在阅读这篇文档之前,你可能需要阅读和理解这些文档。 在整个参考资料中,我们将使用在 数据库查询指南 中提出的 示…

数仓建设实践——58用户画像数仓建设

目录 一、数据仓库&用户画像简介 1.1 数据仓库简介 1.2 数据仓库的价值 1.3 用户画像简介 1.4 用户画像—标签体系 二、用户画像数仓建设过程 2.1 画像数仓—背景&现状 2.2 画像数仓—整体架构 2.3 画像数仓—研发流程 2.4 画像数仓—指标定义 2.5 画像数仓…

【有芯职说】数字IC前端工程师

数字IC前端设计 一、概述 数字IC前端设计,作为数字IC芯片设计流程的关键一环,是数字IC设计类岗位的重要组成部分。随着芯片规模的不断扩大与业务范围的增加,特别是在国产自主化潮流的推动下,该岗位的需求日益增长,经验丰富的工程师更是炙手可热。 数字IC前端设计主要包含…

RabbitMQ相关总结

Broker 异步调用中用Broker进行事件订阅和调用,完成解耦 没有强依赖,不用担心级联失败 流量削峰 MQ 的下载 1.可以使用命令拉取镜像 docker pull rabbitmq:3-management 2.也可以直接去官网下载tar包,然后上传到虚拟机上面 spring AMQP…

35岁程序员的经历和看法

35岁程序员的人生感悟:岁月见证的成长与转变 在程序员的世界里,35岁往往被视为一个重要的节点。对于许多人来说,这个年纪意味着成熟、稳定和经验的积累。作为一名35岁的程序员,我想分享一下自己的经历和看法。 回顾自己的职业生涯…

【数据库管理操作】Mysql 创建学生数据库及对数据表进行修改

MySQL 创建学生成绩数据库 1.创建数据库 create database studentscore;创建完成之后,如果需要使用该数据,使用use命令 use studentscore;创建表前查看当前数据库中包含的表 show tables; 2.创建bclass表 create table bclass( class_id char(8) …

程序员 35 真的会失业吗

35 岁被认为是程序员职业生涯的一个重要节点,引发了许多人对职业发展受限的担忧。一些人担心随着年龄的增长,难以跟上技术更新的步伐;而另一些人则坚信丰富的经验和深厚的技术积累是无法替代的财富。 然而,我认为 35 岁并非是程序…

Sublime 彻底解决中文乱码

1. 按ctrl,打开Console,输入如下代码: import urllib.request,os; pf Package Control.sublime-package; ipp sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHand…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

国内ip切换app,让切换ip变得简单

在数字化快速发展的今天,互联网已经成为我们生活中不可或缺的一部分。然而,随着网络应用的深入,用户对于网络环境的需求也日益多样化。其中,IP地址作为网络中的关键标识,其切换与管理显得尤为重要。为了满足用户对于IP…

每日一题 --- 链表相交[力扣][Go]

链表相交 题目:面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链式结…