做 MBTI 测试系统这个念头,最开始其实挺偶然的。我本职是前端出身,平时写 Node.js 只为了搞定一些简单的工具脚本,从来没想过要正儿八经搭一个完整的应用。直到有个朋友的公司要做内部团建,想搞一个“团队性格画像”的小活动,问能不能做成一个网页版的 MBTI 测试,大家扫个码就能答题,答完还能把结果存下来。我随口说了一句“可以用 Node.js + SQLite 搞”,当时只是想显得专业一点,没想到后面真的踩出了一个还挺完整的小项目。
做完之后我复盘了很久,发现这个需求其实非常有代表性:轻量、够用、数据不上云、还要界面好看。今天就以这个实战案例为线索,把从技术选型、数据库设计、后端接口、前端交互到最后的坑位排查,完整地拆给你看。不管你是想练手的初级 Node.js 开发者,还是工作中需要快速交付一个内部工具的同学,这篇文章都值得你花十分钟看完,因为里面每一步都是可以直接复现的。
1. 项目概述与整体思路拆解
1.1 为什么偏偏选 Node.js + SQLite
先回答一个几乎所有的朋友都会问的问题:这年头不都用 MongoDB、MySQL 或者干脆 POSTGRESQL 吗,为什么用 SQLite?
原因分三层。
第一层是需求规模决定了选型。MBTI 测试系统本身就是一个低频小应用,就算给一家 500 人的公司做团建,一天的答题量撑死也就几百条。这种量级的数据,完全没必要引入一台独立的数据库服务。SQLite 是一个嵌入式关系型数据库,说的直白一些,它说白了就是一个文件,你把文件放哪儿,数据就在哪儿。没有服务进程、没有端口、没有权限配置,只要 Node.js 能读文件,它就能读写数据库。
第二层是开发效率。Node.js 配上 sqlite3 这个 npm 包,要做的事非常聚焦——初始化一个 db 文件、建表、写 SQL。不需要像操作 MySQL 那样先安装一个客户端、再申请账号密码、还要考虑字符集编码。整个过程干净利落,特别适合小团队快速出活。
第三层是部署成本几乎为零。最后我打包出去的方式更是简单到了极致:服务器上装一个 Node.js 环境,把项目文件夹一拷,然后 node server.js 一跑就上线了。不需要配 Nginx 反向代理(当然配了更规范),不需要管数据库备份策略,每天定时把那个 .db 文件复制走就是一份完整的备份。这一点在很多内部小工具里是巨大的优势。
所以 Node.js + SQLite 这套组合,玩的就是一个“轻快省事”。如果你在做的是一个重数据分析、高并发、多机部署的项目,那它确实不够看;但如果你面临的需求是“小团队内部快速交付、要能跑还要能看”,这套组合绝对是最合适的起点。
1.2 功能需求拆解与页面流转设计
做任何小项目,最怕的就是不提需求直接上手写代码。我当时把需求粗略梳理成了三条线,这也成为后来功能开发的骨架:
- 答题线:用户打开网页 → 看到测试介绍页 → 点击开始答题 → 一道一道往下选 → 提交答案。
- 判定线:服务端接收答案数组 → 计算四个维度的得分 → 得出 MBTI 类型(如 INTP、ENFJ)→ 返回结果。
- 管理线:将每一条测试记录写入 SQLite,包括答题明细、结论类型、提交时间,方便之后做简单的统计分析。
为了避免页面来回跳转带来的割裂感,我把整体设计定成了单页应用 + 服务端 API的模式。前端用原生 HTML/CSS/JavaScript,负责渲染题目和收集答案;后端用 Express 提供两个核心接口——一个承接题目列表,一个接收并判定答案。这样前后端职责分离,逻辑也清晰:前端只管“展示与收集”,后端管“算法与存储”。
这里有一个很重要的设计心得分享给你:题目数据千万不要硬编码在前端 JS 里。刚开始我图省事,把所有题目直接写成一个数组放页面顶部,结果每次修改一道题都要去翻前端代码,还要冒着改错格式的风险。后来我把题目全部塞进 SQLite 表里,前端请求 /api/questions 动态获取。这样一来,换题目只需要更新数据库,不需要动一行前端代码,体验完全不一样。数据与视图分离,哪怕是一个小项目,也值得在早期就养成这个习惯。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础工具链
2.1 Node.js 环境安装与验证
开始写业务代码之前,先把 Node.js 环境理清楚。
以我现在用的 18.20.4 LTS 版本为例,直接去官网下载安装包,一顿点击“下一步”就好了。装完之后,需要验证环境是否正常,打开终端分别执行以下两条命令:
bash复制node -v
npm -v
如果终端输出类似 v18.20.4 和 10.7.0 的版本号,说明安装成功。这里要特别提醒一句:新手经常会犯的一个错误是装完了 Node.js 就忘了装 npm,或者以为装好了其实 PATH 没生效,结果执行命令报 node: command not found。遇到这种情况,关掉当前终端窗口重新开一个再试,通常就能解决;如果还不行,检查一下环境变量 PATH 里有没有 Node.js 的安装目录。
项目在哪个目录下建都行,我习惯建一个干净的目录,名字就叫 mbti-test。然后初始化项目:
bash复制mkdir mbti-test
cd mbti-test
npm init -y
npm init -y 会快速生成一个 package.json。接着安装项目依赖:
bash复制npm install express sqlite3 cors
- express:Node.js 后端最流行的 Web 框架,路由和中间件机制都很成熟;
- sqlite3:SQLite 的 Node.js 驱动包,负责建库建表、执行 SQL;
- cors:处理跨域请求。如果你的前端页面和后端服务的端口不一样,比如前端开在 3000、后端开在 5500,那这个包几乎是必需的,否则浏览器控制台会给你刷一屏 CORS 报错。
这里想多说一句关于 sqlite3 的安装。有些环境在 npm install 的时候会卡在编译原生模块这一步,原因是它需要下载预编译二进制文件。如果网络不给力,可以试试设置 npm 镜像源之后重新安装:
bash复制npm config set registry https://registry.npmmirror.com
npm install sqlite3 --build-from-source
实测下来,设置国内镜像源后安装速度会有明显改善。这个坑很隐蔽,很多人装了大半天以为是自己代码的问题,其实是安装源的问题。
2.2 SQLite 数据库与可视化工具准备
SQLite 本身是一个库文件,不像 MySQL 那样有一个独立的服务需要启动。但开发过程中要想直观地“看到”数据库里的内容,光靠命令行敲 sqlite3 进交互模式还是太折磨了。我强烈推荐装一个桌面可视化工具——DB
