Express.js,猫鼬:填充返回null

时间:2020-10-19 08:15:46

标签: node.js mongodb express mongoose

我正在学习 express.js mongoDB ,并且想要创建一个功能,用户应该可以在其中添加产品。 我的代码包含两个模型,用户产品。用户引用了产品。当我尝试填充产品时,在用户查询中,返回
我正在使用邮递员进行测试,结果在购物车中为
我是一个初学者,不了解如何解决该问题。


用户架构

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
}

1 个答案:

答案 0 :(得分:0)

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

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

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