mongodb 如何在javascript中使用mongoose findById()和populate()?

lymnna71  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(276)

我试图为每个用户创建一个项目列表,这意味着用户可以创建项目,而我希望为每个用户保留这些数据。我在下面创建了两个不同的模式:
user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

userSchema = new Schema({
  unique_id: Number,
  email: String,
  username: String,
  password: String,
  passwordConf: String,
  teamname: String,

  items: [{ type: Schema.Types.ObjectId, ref: 'Item' }],
});

(ItemSchema = new Schema({
  createrId: { type: Schema.Types.ObjectId, ref: 'User' },

  productname: String,
  description: String,
  price: String,
  totalStock: String,
})),
  (Item = mongoose.model('Item', ItemSchema));
User = mongoose.model('User', userSchema);

module.exports = { Item, User };

在创建了2个模式后,他在index.js中使用它们,将所有内容路由在一起。
index.js

router.get('/create_item', function (req, res, next) {
  return res.render('items.ejs');
});

router.post(
  '/create_item',
  function (
    req,
    res,
    next // Try to create items in database
  ) {
    console.log(req.body);
    var itemInfo = req.body;

    if (
      !itemInfo.itemname ||
      !itemInfo.itemdsc ||
      !itemInfo.itemstock ||
      !itemInfo.itemprice
    ) {
      res.send();
    } else {
      var NewItem = new Item({
        createrId: loggedInUser._id,
        productname: itemInfo.itemname,
        description: itemInfo.itemdsc,
        price: itemInfo.itemprice,
        totalStock: itemInfo.itemstock,
      });

      NewItem.save(function (err, Item) {
        if (err) console.log(err);
        else console.log('Item added succesfully !');
      });
    }

    User.findById(loggedInUser._id)
      .populate('items')
      .exec(function (err, result) {
        if (err) {
          console.log(err);
        } else {
          console.log('Suceess ? : ', result.items);
          console.log(loggedInUser._id);
        }
      });
  }
);

我将loggedInUser的数据保存在**'/login'**中,以便它返回一个值。

"Suceess ? :[]
6379921faf39150008fa1b88
Item added succesfully !

哪个认为问题是从输出它试图填充项目后,项目被创建,但如何才能解决这个问题?谢谢

j2qf4p5b

j2qf4p5b1#

问题是您的代码没有按顺序执行(NewItem.saveUser.findById之后记录)。
尝试使用async await,同时您需要将新创建的项_id添加到相应的User,以将新引用添加到items数组:

router.post(
  '/create_item',
  async function (
    req,
    res,
    next // Try to create items in database
  ) {
    console.log(req.body);
    try {
      var itemInfo = req.body;

      if (
        !itemInfo.itemname ||
        !itemInfo.itemdsc ||
        !itemInfo.itemstock ||
        !itemInfo.itemprice
      ) {
        return res.send('Incomplete parameters');
      }

      const newItem = await Item.create({
        createrId: loggedInUser._id,
        productname: itemInfo.itemname,
        description: itemInfo.itemdsc,
        price: itemInfo.itemprice,
        totalStock: itemInfo.itemstock,
      });

      const result = await User.findByIdAndUpdate(loggedInUser._id, {
        $push: { items: newItem._id },
      }, { new: true })
        .populate('items')
        .exec();

      console.log('Suceess ? : ', result.items);
      console.log(loggedInUser._id);
      return res.send('Finished');
    } catch (e) {
      console.log(e);
    }
  }
);

相关问题