tasks.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var express = require('express');
  2. var createError = require('http-errors')
  3. var router = express.Router();
  4. const models = require('../../models');
  5. // 获取task
  6. router.get('/', function (req, res, next) {
  7. (async function () {
  8. const { uuid, art } = req.query; // 从查询参数中获取 uuid 和 art
  9. // 1. 参数校验
  10. if (!uuid || !art) {
  11. return res.status(400).json({ message: '请求参数缺失。uuid 和 art 均为必填项。' });
  12. }
  13. // 2. 根据 uuid 和 art 查找记录
  14. const taskRecord = await models.Task.findOne({ uuid: uuid, art: art });
  15. // 3. 判断是否找到记录
  16. if (!taskRecord) {
  17. return res.status(404).json({ message: '未找到匹配的任务数据。' });
  18. }
  19. // 4. 返回找到的任务数据
  20. res.status(200).json(taskRecord.tasks);
  21. })().catch(next);
  22. });
  23. // 提交task id列表
  24. router.post('/', async (req, res) => {
  25. try {
  26. // 验证输入
  27. const { uuid, art, tasks } = req.body; // 从请求体中获取参数
  28. // 1. 参数校验
  29. if (!uuid || !art || !Array.isArray(tasks)) {
  30. return res.status(400).json({ message: '请求参数缺失或格式不正确。uuid, art 和 tasks (number数组) 均为必填项。' });
  31. }
  32. // 2. 验证 tasks 数组中的元素是否都是数字
  33. if (tasks.some(isNaN)) {
  34. return res.status(400).json({ message: 'tasks 数组中包含非数字元素。' });
  35. }
  36. // 3. 使用 findOneAndUpdate 进行 upsert 操作
  37. // query: 根据 uuid 和 art 查找记录
  38. const query = { uuid: uuid, art: art };
  39. // update: 设置或更新 tasks 字段,并更新 updatedAt 时间
  40. const update = { tasks: tasks, updatedAt: Date.now() };
  41. // options:
  42. // upsert: true - 如果找不到匹配的记录,则创建一条新记录
  43. // new: true - 返回更新后的文档,而不是原始文档
  44. const options = { upsert: true, new: true, setDefaultsOnInsert: true };
  45. const taskRecord = await models.Task.findOneAndUpdate(query, update, options);
  46. // 4. 返回成功响应
  47. res.status(200).json({
  48. message: '任务数据提交成功!',
  49. data: taskRecord
  50. });
  51. } catch (error) {
  52. console.error('提交任务数据时发生错误:', error);
  53. // 5. 错误处理
  54. if (error.code === 11000) { // MongoDB 唯一索引冲突错误码
  55. return res.status(409).json({ message: '数据冲突:uuid 和 art 的组合已存在,但更新失败。' });
  56. }
  57. res.status(500).json({ message: '服务器内部错误,提交失败。' });
  58. }
  59. });
  60. module.exports = router;