在Glitch中用Fastify实现表单数据存入SQL数据库及邮件发送
Glitch上Fastify项目:SQL数据库搭建+邮箱表单处理全流程
一、Glitch上SQLite数据库搭建(新手友好)
Glitch内置支持SQLite,无需额外云服务,步骤如下:
安装依赖
打开Glitch项目终端(左下角「Tools」→「Terminal」),输入:npm install sqlite3 sequelize选用Sequelize ORM是因为它简化了数据库操作,降低新手上手门槛。
初始化数据库连接
在项目根目录新建models文件夹,创建db.js文件并写入:const { Sequelize, DataTypes } = require('sequelize'); // Glitch文件系统持久化,数据库文件存于database文件夹 const sequelize = new Sequelize({ dialect: 'sqlite', storage: './database/db.sqlite' // 自动生成db.sqlite文件 }); // 创建邮箱存储表模型 const Email = sequelize.define('Email', { address: { type: DataTypes.STRING, allowNull: false, unique: true // 避免重复存储同一邮箱 } }); // 同步数据库(首次运行自动建表) (async () => { await sequelize.sync({ force: false }); // force设为true会清空旧表,仅调试用 console.log('数据库表同步完成'); })(); module.exports = { sequelize, Email };验证连接
重启Glitch项目(右上角「Restart Project」),查看终端输出,若出现「数据库表同步完成」则连接成功。
二、Fastify配置与表单提交处理
假设你已有index.ejs表单,按以下步骤完成提交逻辑:
确保视图插件配置
若未安装视图依赖,先执行:npm install @fastify/view ejs在
server.js中配置EJS视图:const fastify = require('fastify')({ logger: true }); const { Email } = require('./models/db'); // 导入你已实现的Nodemailer发送函数 const { sendEmail } = require('./utils/nodemailer'); // 注册视图插件 fastify.register(require('@fastify/view'), { engine: { ejs: require('ejs') }, root: './views' // index.ejs需放在views文件夹下 }); // 渲染表单页面 fastify.get('/', async (request, reply) => { return reply.view('/index.ejs'); });添加表单提交路由
在server.js中新增POST路由:// 处理邮箱提交 fastify.post('/submit-email', async (request, reply) => { try { const { email } = request.body; // 表单input的name需设为email if (!email) { return reply.status(400).send('请输入有效的邮箱地址'); } // 1. 存入数据库 await Email.create({ address: email }); // 2. 调用Nodemailer发送邮件 await sendEmail(email); // 提交成功后跳转回表单页并显示提示 return reply.redirect('/?success=1'); } catch (err) { fastify.log.error(err); // 处理重复邮箱、数据库错误等场景 if (err.name === 'SequelizeUniqueConstraintError') { return reply.status(400).send('该邮箱已提交过'); } return reply.status(500).send('提交失败,请稍后重试'); } }); // 启动服务 const start = async () => { try { await fastify.listen({ port: process.env.PORT || 3000 }); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();调整表单HTML
确保views/index.ejs中的表单配置正确:<form method="POST" action="/submit-email"> <input type="email" name="email" placeholder="输入你的邮箱" required> <button type="submit">提交</button> <% if (request.query.success) { %> <p style="color: green;">提交成功!</p> <% } %> </form>
三、常见报错排查
- 数据库路径错误:Glitch项目根目录为
/app,存储路径写./database/db.sqlite即可,不要使用绝对路径。 - 依赖安装失败:若
sqlite3安装报错,在package.json中指定兼容版本"sqlite3": "^5.1.6"后重新安装。 - 表单参数无法获取:确保input的
name属性为email,若仍无法获取,注册@fastify/formbody插件:
在npm install @fastify/formbodyserver.js中添加:fastify.register(require('@fastify/formbody'));
内容的提问来源于stack exchange,提问作者Mridin
相关产品推荐
相关产品推荐

