# SQLite + Node.js 入门：保存留言到数据库

URL: https://caijiao.org/posts/32
Source: docs/posts/32.md
Description: 本教程将带你从零开始使用 Node.js 与 SQLite 实现一个简单的留言板，涵盖数据库初始化、表结构设计、数据插入与查询的完整流程。

[SQLite](/sqlite/) 是一个轻量级、零配置的数据库，非常适合小型项目或本地开发。结合 Node.js，可以轻松实现一个“保存留言到数据库”的功能。

## 一、项目初始化

首先，创建一个新的 Node.js 项目：

```bash
mkdir message-board
cd message-board
npm init -y
````

然后安装需要的依赖：

```bash
npm install express sqlite3 body-parser
```

依赖说明：

* **[express](/express/)**：轻量级 Web 框架，用于处理 HTTP 请求。
* **sqlite3**：Node.js 官方 SQLite 驱动。
* **body-parser**：用于解析 POST 请求体。

## 二、初始化数据库

在项目根目录新建一个文件 `db.js`：

```js
// db.js
const sqlite3 = require("sqlite3").verbose();

// 创建或连接数据库
const db = new sqlite3.Database("./messages.db");

// 初始化表结构
db.serialize(() => {
  db.run(`
    CREATE TABLE IF NOT EXISTS messages (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      message TEXT NOT NULL,
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    )
  `);
});

module.exports = db;
```

这段代码会自动创建一个名为 `messages.db` 的数据库文件，并包含一个 `messages` 表。

## 三、创建服务器

新建 `server.js` 文件，创建一个简单的 Express 服务器：

```js
// server.js
const express = require("express");
const bodyParser = require("body-parser");
const db = require("./db");

const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

// 允许跨域（可选）
app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  next();
});

// 保存留言
app.post("/api/message", (req, res) => {
  const { name, message } = req.body;
  if (!name || !message) {
    return res.status(400).json({ error: "姓名和留言内容不能为空" });
  }

  const stmt = db.prepare("INSERT INTO messages (name, message) VALUES (?, ?)");
  stmt.run(name, message, function (err) {
    if (err) return res.status(500).json({ error: err.message });
    res.json({ success: true, id: this.lastID });
  });
  stmt.finalize();
});

// 获取留言列表
app.get("/api/messages", (req, res) => {
  db.all("SELECT * FROM messages ORDER BY created_at DESC", (err, rows) => {
    if (err) return res.status(500).json({ error: err.message });
    res.json(rows);
  });
});

const PORT = 3000;
app.listen(PORT, () => console.log(`🚀 Server running at http://localhost:${PORT}`));
```

## 四、测试接口

启动服务器：

```bash
node server.js
```

打开终端（或使用 Postman）测试接口：

### 1️⃣ 保存留言

```bash
curl -X POST http://localhost:3000/api/message \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice","message":"你好，这是一条留言！"}'
```

返回：

```json
{ "success": true, "id": 1 }
```

### 2️⃣ 获取留言列表

```bash
curl http://localhost:3000/api/messages
```

返回：

```json
[
  {
    "id": 1,
    "name": "Alice",
    "message": "你好，这是一条留言！",
    "created_at": "2025-10-28 10:00:00"
  }
]
```

## 五、扩展建议

* ✅ **增加前端页面**：使用 HTML + fetch() 显示留言并提交。
* ✅ **输入验证**：限制留言长度，防止 SQL 注入。
* ✅ **分页与搜索**：支持按时间或关键字筛选留言。
* ✅ **导出功能**：将留言导出为 CSV 文件。

## 总结

通过本教程，你学习了：

* 如何在 Node.js 中使用 SQLite。
* 如何创建表、插入和查询数据。
* 如何搭建一个简单的 REST API。

SQLite + Node.js 的组合适合各种入门级项目，如留言板、笔记本或轻量后台管理系统。简单、稳定、免维护，是学习数据库编程的绝佳起点。
