【问题标题】:Express.js, Mongoose: Populate returns nullExpress.js,猫鼬:填充返回 null
【发布时间】:2020-10-20 11:06:35
【问题描述】:

我正在学习 express.jsmongoDB,并希望创建一个功能,user 应该能够在其中添加产品。 我的代码包含 2 个模型,UserProduct。用户引用了产品。在 User 查询中,当我尝试填充 Product' 时,返回 null
我正在用 postman 对其进行测试,结果 nullcart 中。
我是初学者,不明白如何解决问题。


用户模式

import mongoose, { Document } from 'mongoose'
import { ProductDocument } from './Products'

export type UserDocument = Document & {
  firstName: string;
  lastName: string;
  password: string;
  email: string;
  isAdmin: boolean;
  cart: ProductDocument[];
  resetLink: string;
}

const userSchema = new mongoose.Schema({
  firstName: {
    type: String,
    required: true,
    max: 64,
  },
  lastName: {
    type: String,
    required: true,
    max: 64,
  },
  password: {
    type: String,
    required: true,
    min: 6,
  },
  email: {
    type: String,
    required: true,
    lowercase: true,
    trim: true,
  },
  isAdmin: {
    type: Boolean,
    default: false,
  },
  cart: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Products',
    },
  ],
  resetLink: {
    data: String,
    default: '',
  },
})

export default mongoose.model<UserDocument>('Users', userSchema)



产品架构


import mongoose, { Document } from 'mongoose'

export type ProductDocument = Document & {
  name: string;
  description: string;
  categories: string[];
  variants: string[];
  sizes: number[];
}

const productSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    index: true,
  },
  description: {
    type: String,
  },
  categories: [String],
  variants: [String],
  sizes: [Number],
})

export default mongoose.model<ProductDocument>('Products', productSchema)



以及负责填充的控制器

export const getProduct = async (req: Request, res: Response) => {
    try {
        const { productId } = await req.body
        const productBought = await Products.findOne({ _id: productId }).then(
            (product) => {
                return product
            }
        )
        console.log(productBought)

        const updated = await Users.findOneAndUpdate(
            { _id: req.params.userId },
            { $push: { cart: productBought } },
            { new: true }
        )
            .populate('cart')
            .exec()
        return res.json(updated)
    } catch (error) {
        return res.status(404).json({ message: 'does not work' })
    }
}

邮递员的输出


{
    "isAdmin": false,
    "cart": [
        null,
        null
    ],
    "_id": "5f894b3c06b4a108f8d9a7ab",
    "firstName": "John",
    "lastName": "Doe",
    "password": "$2b$08$rA0/r8iVBWeSyyerPDpPWO.ztgouQoseX0QFBZ.mlPgb6tELlrhpy",
    "email": "john@gmail.com",
    "__v": 0
}

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您的“购物车”喜欢[ObjectId,ObjectId],但您的“productBought”喜欢[{},{}]。

    试试let cart = [];productBought.forEach((v,k) =&gt; {cart[k] = v._id});

    并使用{ $push: { cart: { $each: cart } },

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2016-04-28
      • 2023-03-21
      • 2019-07-17
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多