簡體   English   中英

ZCCADCDEDB567ABAE643E15DCF0974E503Z 一對多不起作用(Nodejs)

[英]Mongoose one-to-many not working (Nodejs)

我創建了 2 個用戶(管理員和用戶),並且我為一個用戶創建了許多 ToDos,但是我的 Todo 數組在我的用戶架構中是空的。 無法理解為什么 todo 任務沒有分配給用戶架構。

用戶模式

var userSchema = new Schema({
    name: {
        type: String,
        required: true,
        maxlength: 30,
        trim: true
    },    
    role: {
        type: Number,
        default: 0
    },
    todos: [{
        type: Schema.Types.ObjectId,
        ref:"Todo"
    }]
});
module.exports = mongoose.model("User", userSchema)

待辦事項模式

let Todo = new Schema({
    todo_heading: {
        type: String
    },
    todo_desc: {
        type: String
    },
    todo_priority: {
        type: String
    },
    todo_completed: {
        type: Boolean
    },
    user: {
        type: Schema.Types.ObjectId,
        ref:"User"
    }

})

module.exports = mongoose.model('Todo', Todo);

這是我的路線

用戶路線

router.get("/user/:userId/todos", isSignedIn, isAuthenticated, getToDos)

都都路線

router.get("/", getTodos)
router.get("/:id", getUsertodos);
router.post("/user/:userId/add", addUsertodos);

用戶控制器

exports.getToDos = (req, res) => {
    User.find({ _id: req.params._id })
        .populate("todos")
        .exec((err, toDo) => {
            if (err) {
                res.json(err)
            }
            res.json(toDo)
        })
}

待辦事項控制器

exports.addUsertodos = (req, res) => {

    let todo = new Todo(req.body)
    todo.save((err, todo) => {
        if (err) {
            return res.status(400).json({
                error: "not saved"
            })
        }
        else {
            return res.json(todo)
        }
    })
}

在此處輸入圖像描述

如果在創建用戶時將新創建的 todo 的 objectId 添加到 todos 屬性,它應該可以按預期工作。

   //routers/todo.js
    var express = require('express');
    var router = express.Router();
    const Todo = require('../models/Todo');
    const User = require('../models/User');
    
    /* GET home page. */
    router.get('/', async function (req, res) {
      let todos = await Todo.find();
      res.json({
        todos
      });
    });
    
    router.post('/todos', async function (req, res) {
      //add todos
      let {
        todo_desc,
        todo_heading,
        todo_priority,
        todo_completed
      } = req.body;
      try {
        //NOTE: for simplicity assigning first user but you can grab it from the params
        let user = await User.findOne();
        let todo = await Todo.create({
          todo_desc,
          todo_completed,
          todo_priority,
          todo_heading,
          user: user._id
        })
        res.json({
          message: 'todo created successfully',
          todo
        });
      } catch (err) {
        return res.status(500).json({
          message: 'Unable to create a todo',
          err: JSON.stringify(err)
        })
      }
    
    });
    
    module.exports = router; 

這是用戶路由,其中 post 路由獲取創建 ID 的字符串 id 並將其轉換為 ObjectId(),將其分配給 todos。

var express = require('express');
var router = express.Router();
let _ = require('lodash');
var mongoose = require('mongoose');


const User = require('../models/User');
/* GET users listing. */


router.post("/", async function (req, res) {
  let {
    name,
    todos
  } = req.body;

  try {
    let user = new User();
    user.name = name;
    let objectIds = todos.split(',').map(id => mongoose.Types.ObjectId(id));
    user.todos.push(...objectIds)
    await user.save()
    console.log("user: ", JSON.stringify(user));
    if (_.isEmpty(user)) {
      res.status(500).json({
        message: 'unable to create user'
      })
    }
    res.json(user);
  } catch (err) {
    res.status(500).json({
      message: 'unable to create user',
      err: JSON.stringify(err)
    })
  }
});

router.get("/", async function (req, res) {
  try {
    let user = await User.find().populate('todos');
    console.log("user: ", JSON.stringify(user));
    if (_.isEmpty(user)) {
      res.status(500).json({
        message: 'unable to find user'
      })
    }
    res.json(user);
  } catch (err) {
    res.status(500).json({
      message: 'unable to find user',
      err: JSON.stringify(err)
    })
  }
});

module.exports = router;

查看隨附的屏幕截圖,用戶記錄現在包含分配給它的待辦事項。

填充待辦事項

如果你想檢查工作代碼,請訪問我創建的這個repo 。!。

希望這有幫助。干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM