App Inventor 2 网络微数据库后台搭建教程 - 自建TinyWebDB服务

« 返回首页

先弄明白要做什么

网络微数据库(TinyWebDB)组件自己不存数据,它把数据发给一个“服务端”程序保管。默认的服务端在 MIT 的服务器上:所有人共用、条目会被覆盖,中文读出来是乱码。

自建,就是在你自己的电脑或服务器上运行一个服务端程序,再把 App 里组件的“服务地址”改成它:

手机上的 App ──网络──▶ 你的电脑 / 云服务器(运行 tinywebdb_server.py)──▶ 数据文件

本文提供的服务端程序只有一个 Python 文件,不需要安装数据库,也不需要 pip 安装任何东西。照着步骤做,第一次大约 20 分钟。

先确认网络微数据库适合你:它只能“按标签存一个值、按标签取一个值”,适合留言板、排行榜、简单的多人共享数据。本文的服务端还带了图片上传,App 用 Web 客户端把图片传上来、换回一个图片地址。如果要用户账号、按条件查询,请直接用 CloudBase 或 Supabase 拓展,不必自建。

搭好以后,可以接着学《联网 App 入门专题》:5 课从连通测试做到带图商品墙,都用这个服务端。

选一条路线

  路线 A:自己的电脑 路线 B:云服务器
适合 课堂演示、调试、学习 给别人长期使用
花费 免费 租一台云服务器(最低配置就够)
手机要求 和电脑连同一个 WiFi 任何网络(4G/5G 也行)
什么时候停 电脑关机、睡眠或关掉窗口就停 一直运行,重启服务器后自动启动

不确定就先走路线 A,跑通后再搬到云服务器,App 只需改一下服务地址。

第一步:下载服务端源码

解压后得到 tinywebdb-server 文件夹,里面有:

文件 作用
tinywebdb_server.py 服务端程序(在线查看源码)
start-windows.bat Windows 双击启动
start-linux.sh Linux / macOS 启动
tinywebdb.service 云服务器开机自启的配置
README.txt 文件说明

第一次运行后会多出:

  • secret.txt:访问口令,自动随机生成,是服务地址的最后一段。别人不知道口令就读写不了你的数据。
  • tinywebdb.sqlite3:网络微数据库的数据都在这里。
  • files 文件夹:App 上传的图片(第一次有人上传时才出现)。

备份 tinywebdb.sqlite3 和 files 文件夹就是备份全部数据。

路线 A:在自己的 Windows 电脑上运行

A1. 安装 Python

  1. 打开 Python 官网下载页,下载最新的 “Windows installer (64-bit)”。官网慢的话,用华为云镜像 mirrors.huaweicloud.com/python:进入版本号目录(如 3.12.10/),下载以 -amd64.exe 结尾的文件。
  2. 双击安装包,先勾选底部的 “Add python.exe to PATH”,再点 “Install Now”。
  3. 装完点 “Close”。

需要 Python 3.8 或更新的版本。已经装过的可以跳过这一步。

A2. 启动服务端

  1. 把 tinywebdb-server 文件夹放到容易找到的地方,比如桌面。
  2. 双击里面的 start-windows.bat,会弹出一个黑色窗口。
  3. 如果弹出 “Windows 安全中心警报”,勾选“专用网络”和“公用网络”,点“允许访问”。不允许的话手机连不上。
  4. 窗口里出现下面这样的内容,就说明启动成功:
============================================================
网络微数据库服务已启动,关闭这个窗口服务就会停止。
在 App 里把“服务地址”设为:
    http://192.168.1.19:5000/3f9a1c7e
用浏览器打开上面的地址可以查看所有数据。
在云服务器上运行时,把地址里的 IP 换成服务器的公网 IP。
============================================================

中间那行 http://… 就是你的服务地址(每台电脑的 IP 和口令都不一样,以你窗口里显示的为准)。这个窗口不要关,关了服务就停了。

macOS 或 Linux 电脑:打开“终端”,进入文件夹后运行 sh start-linux.sh,看到同样的输出即可。

A3. 用手机浏览器检查能不能连上

这一步最关键,能省掉之后大部分排错时间。

  1. 手机连上和电脑同一个 WiFi。
  2. 在手机浏览器里输入窗口里显示的服务地址。
  3. 看到“网络微数据库:共 0 条,图片 0 张”的页面,就说明手机能连上服务端。

打不开时,按常见问题的 Q1、Q2 排查,不要急着去改 App。

路线 B:部署到云服务器

下面以 Ubuntu 系统为例,阿里云、腾讯云、华为云的操作都一样。只用“IP + 端口”访问不需要域名。

B1. 准备服务器

  1. 在云厂商购买一台云服务器(轻量应用服务器即可),最低配置就够用,系统镜像选 Ubuntu 22.04 或 24.04。
  2. 记下服务器的公网 IP(控制台的实例详情里能看到)。
  3. 在控制台找到“防火墙”或“安全组”,添加一条规则:放行 TCP 端口 5000,来源填 0.0.0.0/0。忘了这一步,手机一定连不上。

B2. 登录服务器

在云厂商控制台的实例页面点“登录”或“远程连接”,选浏览器里的网页终端即可,不需要另外装软件。看到以 $ 或 # 结尾的命令行提示符,就可以输入命令了。

B3. 安装服务端

逐条复制下面的命令,粘贴到终端里回车执行:

sudo apt update
sudo apt install -y python3 unzip wget
sudo mkdir -p /opt/tinywebdb
cd /opt/tinywebdb
sudo wget https://www.fun123.cn/reference/creative/tinywebdb_server/tinywebdb-server.zip
sudo unzip -o -j tinywebdb-server.zip
ls

最后的 ls 应当列出 tinywebdb_server.py、tinywebdb.service 等文件。

B4. 设为开机自动运行

sudo cp /opt/tinywebdb/tinywebdb.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now tinywebdb
sudo systemctl status tinywebdb --no-pager

看到绿色的 active (running) 就说明服务在运行。服务端以一个权限受限的系统用户运行,数据和口令保存在 /var/lib/tinywebdb/。

B5. 拿到服务地址

sudo cat /var/lib/tinywebdb/secret.txt

输出的一串字符就是口令。你的服务地址是:

http://公网IP:5000/口令

例如公网 IP 是 47.100.1.2、口令是 3f9a1c7e,服务地址就是 http://47.100.1.2:5000/3f9a1c7e。

如果服务器开着 ufw 防火墙(执行 sudo ufw status 显示 Status: active),还要执行一次 sudo ufw allow 5000/tcp。

B6. 用手机检查

手机关掉 WiFi,用流量打开服务地址,看到“网络微数据库:共 0 条,图片 0 张”就成功了。

第二步:在 App 里使用

设置服务地址

在设计器里选中“网络微数据库1”组件,把“服务地址”属性改成你的服务地址。也可以在代码块里设置:

when Screen1.Initialize() {
  网络微数据库1.ServiceURL = "http://192.168.1.19:5000/3f9a1c7e"
}

服务地址末尾不要加 /(本文的服务端两种都兼容,其它服务端不一定)。

写一个最小测试

界面放一个文本输入框、两个按钮(保存、读取)和一个标签:

when 按钮_保存.Click() {
  网络微数据库1.StoreValue("留言", 文本输入框1.Text)
}

when 网络微数据库1.ValueStored() {
  标签1.Text = "保存成功"
}

when 按钮_读取.Click() {
  网络微数据库1.GetValue("留言")
}

when 网络微数据库1.GotValue(tagFromWebDB, valueFromWebDB) {
  if valueFromWebDB == "" {
    标签1.Text = "还没有保存过"
  } else {
    标签1.Text = join("读到:", valueFromWebDB)
  }
}

when 网络微数据库1.WebServiceError(message) {
  标签1.Text = join("网络出错:", message)
}

在伴侣里运行,输入一段中文点“保存”,标签显示“保存成功”;点“读取”,标签显示刚才输入的内容。再用浏览器刷新服务地址页面,表格里能看到“留言”这一条,值带着双引号,这是正常的(保存的是 JSON 文本)。

用两台手机分别运行同一个 App,一台保存、另一台读取,就是最简单的多人共享数据。注册登录、排行榜等完整示例见注册登录教程和云数据库配置教程。

日常维护

要做的事 自己电脑 云服务器
查看所有数据 浏览器打开服务地址 同左
停止服务 关掉黑色窗口 sudo systemctl stop tinywebdb
重新启动 再双击 start-windows.bat sudo systemctl restart tinywebdb
看运行日志 黑色窗口里就是 sudo journalctl -u tinywebdb -n 50
备份数据 复制 tinywebdb.sqlite3 和 files 文件夹 sudo cp -r /var/lib/tinywebdb ~/tinywebdb-backup
换口令 删除 secret.txt 后重启 sudo rm /var/lib/tinywebdb/secret.txt 后重启
清空全部数据 停止服务,删除 tinywebdb.sqlite3 和 files 文件夹,再启动 同左,文件在 /var/lib/tinywebdb/

换口令后,旧服务地址立即失效,App 要改成新地址。

常见问题

Q1:双击 start-windows.bat,窗口一闪就没了,或提示“不是内部或外部命令”

Python 没装好,或安装时没勾选 “Add python.exe to PATH”。重新运行安装包,选 “Modify” → 一路下一步 → 勾选 “Add Python to environment variables”;或者卸载后按 A1 重装。

Q2:手机浏览器打不开服务地址

按顺序检查:

  1. 电脑上的黑色窗口还开着吗?电脑睡眠了吗?
  2. 手机和电脑是不是同一个 WiFi?手机用流量时连不上你家里的电脑。
  3. 防火墙拦住了:Windows 搜索“允许应用通过 Windows 防火墙”,找到 Python,把“专用”和“公用”都勾上。
  4. 学校、公司、商场的 WiFi 常常禁止设备互相访问。换成用手机开热点、让电脑连手机热点,再试一次。
  5. 云服务器:安全组没有放行 TCP 5000,或 ufw 没放行(见 B5)。

Q3:窗口里报错 “address already in use” 或 “通常每个套接字地址只允许使用一次”

5000 端口被别的程序占用了。用记事本打开 tinywebdb_server.py,把 "5000" 改成 "5001" 等其它数字,保存后重新启动,服务地址里的端口也跟着变。云服务器上改完要执行 sudo systemctl restart tinywebdb,安全组也要放行新端口。

Q4:App 里提示“网络出错”

  • 先用手机浏览器打开服务地址,打不开就按 Q2 排查。
  • 能打开但 App 报错:核对“服务地址”有没有抄错,尤其是口令那一段。
  • 报 404:口令不对。口令以 secret.txt 为准。

Q5:读出来的值是空的

标签不存在时就返回空文本。确认保存和读取用的是同一个标签(区分大小写、注意空格),保存时“值存储完毕时”事件有没有触发。

Q6:电脑重启后数据还在吗?

在。数据在 tinywebdb.sqlite3 文件里,重新启动服务端就能接着用。口令也不变。

Q7:安全吗?

  • 口令会随 App 一起分发,能挡住随手扫描的人,挡不住拆包。不要用网络微数据库存密码、身份证号等敏感信息,需要账号系统请用 CloudBase / Supabase。
  • 服务地址是 http://,数据明文传输。课堂和练习够用;正式产品建议给服务器配域名和 HTTPS。
  • 网络微数据库组件不能设置请求头,所以口令只能放在服务地址里。

Q8:数据多了怎么办?

网络微数据库每次只能按一个标签存取,不能按条件查询、排序、分页。数据量大或需要筛选时,改用 CloudBase 的数据库组件,或用 Web 客户端连接自建 MySQL。

附:通信协议(自己写服务端时参考)

想用 PHP、Node.js 等其它语言实现,只要遵守下面的约定,网络微数据库组件就能直接使用。PHP 和 Node.js 的参考实现见云数据库配置教程第 4.4、4.5 节。

组件把请求发到“服务地址 + / + 命令名”:

动作 请求 服务端返回
保存值 POST 服务地址/storeavalue,表单字段 tag、value 任意内容,返回 HTTP 200 即触发“值存储完毕时”
获取值 POST 服务地址/getvalue,表单字段 tag JSON 数组 ["VALUE", 标签, 值]

注意三点:

  1. 请求体是表单编码(application/x-www-form-urlencoded,UTF-8),不是 JSON 请求体。
  2. value 字段是值的 JSON 文本:存文本 张三 时实际发来的是 "张三"(带引号),存列表时是 [1,2]。服务端原样保存,取值时原样放回数组第三项。
  3. 标签不存在时第三项返回空字符串 "",组件拿到的值就是空文本。没有 NO_DATA 这种约定。

图片上传是本文服务端额外提供的接口,不属于网络微数据库协议,App 用 Web 客户端调用:

动作 请求 服务端返回
上传图片 POST 服务地址/upload,请求体就是图片文件(Web 客户端的「执行 POST 文件请求」) {"status": "OK", "url": 图片地址, "name": 文件名}
取回图片 GET 服务地址/files/文件名 图片本身
  • 只收 jpg、png、gif、webp(按文件头判断,改扩展名没用),否则返回 400;超过 5MB 返回 413;口令不对返回 404。
  • Web 客户端发文件用分块传输,请求里没有 Content-Length,自己写服务端时要能读分块的请求体。
  • 回复之前要先把请求体读完。手机还在发送时服务端就回复并断开,手机收到的是“连接被重置”,看不到 404/413 这些原因。
  • 图片地址里带着服务端的 IP 和端口,服务端换了电脑或 IP,旧图片地址就打不开了。

其它选择

需求 选择 说明
不想自己运行服务端 国内免费的网络微数据库服务 见组件文档中文网注,单个值有大小上限
要用户账号、图片文件、按条件查询 CloudBase / Supabase 拓展 网络微数据库做不了账号和文件

LeanDB 是 LeanCloud 的拓展,不是网络微数据库服务,不能填进“服务地址”。LeanCloud 已公告 2027-01-12 停止服务,新项目改用 CloudBase。

文档反馈