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

在Glitch中用Fastify实现表单数据存入SQL数据库及邮件发送

Glitch上Fastify项目:SQL数据库搭建+邮箱表单处理全流程

一、Glitch上SQLite数据库搭建(新手友好)

Glitch内置支持SQLite,无需额外云服务,步骤如下:

  1. 安装依赖
    打开Glitch项目终端(左下角「Tools」→「Terminal」),输入:

    npm install sqlite3 sequelize
    

    选用Sequelize ORM是因为它简化了数据库操作,降低新手上手门槛。

  2. 初始化数据库连接
    在项目根目录新建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 };
    
  3. 验证连接
    重启Glitch项目(右上角「Restart Project」),查看终端输出,若出现「数据库表同步完成」则连接成功。

二、Fastify配置与表单提交处理

假设你已有index.ejs表单,按以下步骤完成提交逻辑:

  1. 确保视图插件配置
    若未安装视图依赖,先执行:

    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');
    });
    
  2. 添加表单提交路由
    在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();
    
  3. 调整表单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>
    

三、常见报错排查

  1. 数据库路径错误:Glitch项目根目录为/app,存储路径写./database/db.sqlite即可,不要使用绝对路径。
  2. 依赖安装失败:若sqlite3安装报错,在package.json中指定兼容版本"sqlite3": "^5.1.6"后重新安装。
  3. 表单参数无法获取:确保input的name属性为email,若仍无法获取,注册@fastify/formbody插件:
    npm install @fastify/formbody
    
    在server.js中添加:
    fastify.register(require('@fastify/formbody'));
    

内容的提问来源于stack exchange,提问作者Mridin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:25:22