用户模式中的数组-猫鼬

时间:2020-01-04 19:22:39

标签: node.js reactjs mongodb express mongoose

使用MERN Stack构建应用程序并为用户的 items 完成了一个简单的CRUD API之后,我想向用户模型添加' categories '属性然后他可以将其添加到他的项目中...

为了解释该应用程序,我计划在将每个用户的数据发布到MongoDB时附加一些默认数据,即类别。不幸的是,我无法将这些类别“发布”到数据库中。

这是我尝试过的不同请求和架构组合

  1. 作为自己的模式

用户路线

const User = require("../models/User")

// @route     POST api/users
// @desc      Regiter a user
// @access    Public
router.post(
  "/",
  [
    check("name", "Please add name")
      .not()
      .isEmpty(),
    check("email", "Please include a valid email").isEmail(),
    check(
      "password",
      "Please enter a password with 6 or more characters"
    ).isLength({ min: 6 })
  ],
  async (req, res) => {
    const errors = validationResult(req)
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() })
    }

    const { name, email, password } = req.body
    console.log(categories)
    try {
      let user = await User.findOne({ email })

      if (user) {
        return res.status(400).json({ msg: "User already exists" })
      }

      user = new User({
        name,
        email,
        password,
      })

      const salt = await bcrypt.genSalt(10)

      user.password = await bcrypt.hash(password, salt)

      await user.save()

      const payload = {
        user: {
          id: user.id
        }
      }

      jwt.sign(
        payload,
        config.get("jwtSecret"),
        {
          expiresIn: 360000
        },
        (err, token) => {
          if (err) throw err
          res.json({ token })
        }
      )
    } catch (err) {
      console.error(err.message)
      res.status(500).send("Server Error")
    }
  }
)

module.exports = router

AuthState中的请求

    // Register User
      const register = async formData => {
        console.log(formData)
        const expandedFormData = {
          ...formData,
          categories: [
            { name: "Testcategory1", test: 1 },
            { name: "Testcategory2", test: 2 }
          ]
        }
        const config = {
          headers: {
            "Content-Type": "application/json"
          }
        }
        try {
          const res = await axios.post("/api/users", expandedFormData, config)
          console.log(expandedFormData)
          dispatch({
            type: REGISTER_SUCCESS,
            payload: res.data
          })
          loadUser()
        } catch (err) {
          dispatch({
            type: REGISTER_FAIL,
            payload: err.response.data.msg
          })
        }
      }

模式


        const mongoose = require("mongoose")

        const categorieSchema = mongoose.Schema({
          label: String,
          test: Number
        })

        const UserSchema = mongoose.Schema({
          name: {
            type: String,
            required: true
          },
          email: {
            type: String,
            required: true,
            unique: true
          },
          password: {
            type: String,
            required: true
          },
          date: {
            type: Date,
            default: Date.now
          },
          categories: [categorieSchema]
        })

        module.exports = mongoose.model("user", UserSchema)

2。 AuthState中的请求

....

const expandedFormData = {
      ...formData,
      categories: [{ name: "Testcategory1" }, { name: "Testcategory2" }]
    }

....

模式

....

categories: [
    {
      name: String
    }
  ]

....

3。 AuthState中的请求

模式

与2相同。

....

categories: [
    {
      name: {
        type: String
      }
    }
  ]
....

4。 请求

模式

与2相同。

....

  categories: [String]

....

我也阅读了这些线程,但是它们没有提供新信息: -Mongoose schema array of objects -Save arrays in Mongoose schema

可以在https://github.com/mortizw/Repio-2.0上查看完整的应用程序 除了关于如何使该模型正常工作的一些想法外,我很乐意提供有关如何通过控制台日志记录某些东西来迭代测试/处理“模式问题”的一些技巧。

1 个答案:

答案 0 :(得分:0)

创建new User时,您没有传递Categories,这就是为什么它没有被保存的原因。

首先,此架构将正常运行

categories: [
    {
      name: {
        type: String
      }
    }
  ]

然后您需要将user route更新为此

const { name, email, password,categories } = req.body

user = new User({
        name,
        email,
        password,
        categories
      })

还要确保您只通过前端类别中的name,因为您的架构只有name

您的前端应该是这样

const expandedFormData = {
          ...formData,
          categories: [
            { name: "Testcategory1"},
            { name: "Testcategory2"}
          ]
        }