var express = require('express'); var createError = require('http-errors') var router = express.Router(); const models = require('../../models'); // 获取task router.get('/', function (req, res, next) { (async function () { const { uuid, art } = req.query; // 从查询参数中获取 uuid 和 art // 1. 参数校验 if (!uuid || !art) { return res.status(400).json({ message: '请求参数缺失。uuid 和 art 均为必填项。' }); } // 2. 根据 uuid 和 art 查找记录 const taskRecord = await models.Task.findOne({ uuid: uuid, art: art }); // 3. 判断是否找到记录 if (!taskRecord) { return res.status(404).json({ message: '未找到匹配的任务数据。' }); } // 4. 返回找到的任务数据 res.status(200).json(taskRecord.tasks); })().catch(next); }); // 提交task id列表 router.post('/', async (req, res) => { try { // 验证输入 const { uuid, art, tasks } = req.body; // 从请求体中获取参数 // 1. 参数校验 if (!uuid || !art || !Array.isArray(tasks)) { return res.status(400).json({ message: '请求参数缺失或格式不正确。uuid, art 和 tasks (number数组) 均为必填项。' }); } // 2. 验证 tasks 数组中的元素是否都是数字 if (tasks.some(isNaN)) { return res.status(400).json({ message: 'tasks 数组中包含非数字元素。' }); } // 3. 使用 findOneAndUpdate 进行 upsert 操作 // query: 根据 uuid 和 art 查找记录 const query = { uuid: uuid, art: art }; // update: 设置或更新 tasks 字段,并更新 updatedAt 时间 const update = { tasks: tasks, updatedAt: Date.now() }; // options: // upsert: true - 如果找不到匹配的记录,则创建一条新记录 // new: true - 返回更新后的文档,而不是原始文档 const options = { upsert: true, new: true, setDefaultsOnInsert: true }; const taskRecord = await models.Task.findOneAndUpdate(query, update, options); // 4. 返回成功响应 res.status(200).json({ message: '任务数据提交成功!', data: taskRecord }); } catch (error) { console.error('提交任务数据时发生错误:', error); // 5. 错误处理 if (error.code === 11000) { // MongoDB 唯一索引冲突错误码 return res.status(409).json({ message: '数据冲突:uuid 和 art 的组合已存在,但更新失败。' }); } res.status(500).json({ message: '服务器内部错误,提交失败。' }); } }); module.exports = router;