修复时间: 2026-03-05 08:55 问题: 用户端点击添加评论失败 原因: 后端缺少评论 API 状态: ✅ 已修复并上线
用户报告在用户端点击"添加评论"按钮时失败。经过检查发现:
- 数据库表存在 -
feedback_comments表已经创建 - 后端 API 缺失 -
server/index.ts中没有评论相关的 API 路由 - 前端代码正常 - 前端已经实现了评论功能,只是后端没有对应的接口
// API: 获取反馈的所有评论
app.get('/api/feedback/:feedbackId/comments', (req, res) => {
try {
const { feedbackId } = req.params
const comments = db.prepare(
'SELECT * FROM feedback_comments WHERE feedback_id = ? ORDER BY created_at ASC'
).all(feedbackId) as any[]
res.json({
success: true,
comments: comments.map(c => ({
...c,
created_at: new Date(c.created_at).toISOString()
}))
})
} catch (error) {
console.error('获取评论失败:', error)
res.status(500).json({ error: '获取评论失败' })
}
})// API: 添加评论
app.post('/api/feedback/:feedbackId/comments', (req, res) => {
try {
const { feedbackId } = req.params
const { content, commenterType } = req.body
// 参数验证
if (!content || !commenterType) {
return res.status(400).json({ error: '缺少必要参数' })
}
if (content.trim().length < 2) {
return res.status(400).json({ error: '评论内容至少需要 2 个字符' })
}
if (content.trim().length > 1000) {
return res.status(400).json({ error: '评论内容不能超过 1000 个字符' })
}
if (!['user', 'admin'].includes(commenterType)) {
return res.status(400).json({ error: '无效的评论者类型' })
}
const createdAt = Date.now()
const adminIp = commenterType === 'admin' ? (req.ip || req.socket.remoteAddress || 'unknown') : null
// 插入评论
const stmt = db.prepare(
'INSERT INTO feedback_comments (feedback_id, commenter_type, content, created_at, admin_ip) VALUES (?, ?, ?, ?, ?)'
)
const result = stmt.run(feedbackId, commenterType, content.trim(), createdAt, adminIp)
res.json({
success: true,
comment: {
id: result.lastInsertRowid,
feedback_id: feedbackId,
commenter_type: commenterType,
content: content.trim(),
created_at: new Date(createdAt).toISOString()
}
})
} catch (error) {
console.error('添加评论失败:', error)
res.status(500).json({ error: '添加评论失败' })
}
})将 app.listen 移到所有 API 路由定义之后,确保路由正确注册。
在获取设备反馈时,添加 solution 和 solution_updated_at 字段:
const feedbacks = db.prepare(
'SELECT id, category, original_content, created_at, status, solution, solution_updated_at FROM feedbacks WHERE device_id = ? ORDER BY created_at DESC'
).all(deviceId) as any[]curl -X POST http://localhost:4000/api/feedback/05809786-053f-4eb0-a895-7a2b4d403e39/comments \
-H "Content-Type: application/json" \
-d '{"content":"测试评论","commenterType":"user"}'响应:
{
"success": true,
"comment": {
"id": 9,
"feedback_id": "05809786-053f-4eb0-a895-7a2b4d403e39",
"commenter_type": "user",
"content": "测试评论",
"created_at": "2026-03-05T00:55:04.766Z"
}
}curl http://localhost:4000/api/feedback/05809786-053f-4eb0-a895-7a2b4d403e39/comments响应:
{
"success": true,
"comments": [
{
"id": 9,
"feedback_id": "05809786-053f-4eb0-a895-7a2b4d403e39",
"commenter_type": "user",
"content": "测试评论",
"created_at": "2026-03-05T00:55:04.766Z",
"admin_ip": null,
"attachment_id": null,
"attachment_url": null
}
]
}评论 API 包含完整的参数验证:
- 必填参数检查 -
content和commenterType必填 - 最小长度验证 - 评论内容至少 2 个字符
- 最大长度验证 - 评论内容最多 1000 个字符
- 类型验证 -
commenterType必须是user或admin - 外键约束 -
feedback_id必须存在于feedbacks表中
API 会返回详细的错误信息:
| 错误情况 | HTTP 状态码 | 错误信息 |
|---|---|---|
| 缺少必要参数 | 400 | 缺少必要参数 |
| 评论内容过短 | 400 | 评论内容至少需要 2 个字符 |
| 评论内容过长 | 400 | 评论内容不能超过 1000 个字符 |
| 无效的评论者类型 | 400 | 无效的评论者类型 |
| 反馈不存在 | 500 | 添加评论失败 (外键约束) |
| 服务器错误 | 500 | 添加评论失败 / 获取评论失败 |
- ✅ 代码已修改
- ✅ 服务已重启
- ✅ API 测试通过
- ✅ 功能已上线
1. 用户点击"💬 查看/添加评论"按钮
↓
2. 展开评论区域,显示现有评论
↓
3. 用户输入评论内容(2-1000 字符)
↓
4. 点击"发送评论"
↓
5. 前端调用 POST /api/feedback/:feedbackId/comments
{
"content": "评论内容",
"commenterType": "user"
}
↓
6. 后端验证并保存到数据库
↓
7. 返回成功响应
↓
8. 前端刷新评论列表
1. 管理员在管理后台查看反馈
↓
2. 展开评论区域
↓
3. 管理员输入回复内容
↓
4. 点击"发送评论"
↓
5. 前端调用 POST /api/feedback/:feedbackId/comments
{
"content": "管理员回复",
"commenterType": "admin"
}
↓
6. 后端验证并保存,记录管理员 IP
↓
7. 返回成功响应
↓
8. 用户可以在用户端看到管理员的回复
CREATE TABLE feedback_comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
feedback_id TEXT NOT NULL,
commenter_type TEXT NOT NULL,
content TEXT NOT NULL,
created_at INTEGER NOT NULL,
admin_ip TEXT,
attachment_id INTEGER,
attachment_url TEXT,
FOREIGN KEY (feedback_id) REFERENCES feedbacks(id)
);
CREATE INDEX idx_feedback_comments_feedback_id ON feedback_comments(feedback_id);
CREATE INDEX idx_feedback_comments_created_at ON feedback_comments(created_at);- 参数验证 - 防止无效数据进入数据库
- 长度限制 - 防止超长评论占用过多资源
- 类型验证 - 确保评论者类型合法
- 外键约束 - 确保只能对存在的反馈添加评论
- IP 记录 - 管理员评论会记录 IP 地址用于审计
评论功能现已完全正常! ✅
用户和管理员现在可以:
- 查看评论历史
- 添加新评论
- 进行双向沟通
- 保持意见一致
有任何问题随时找我!🦞