猫鼬填充返回未定义

时间:2021-01-09 02:39:15

标签: javascript node.js mongodb express mongoose

我想做什么


我正在为一家运输公司建立一个旅行预订网站。 我正在尝试在其中一页显示预订者的姓名。
我有一个用户模型和一个预订模型。

用户模型

const mongoose = require("mongoose");
const passportLocalMongoose = require("passport-local-mongoose");
const Schema = mongoose.Schema;


const UserSchema = new Schema({

  email: {
    type: String,
    required: true,
    unique: true
  },
  firstName:{
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  phoneNumber: {
    type: String,
    required: true
  },
  gender: {
        type: String,
        enum: ["male", "female"]
    }
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", UserSchema);

预订模式

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const BookingSchema = new Schema({
  tripDate: {
    type: String,
    required: true
  },
  pickupTime: {
    type: String,
    required: true
  },
  pickupStreet: {
    type: String,
    required: true
  },
  pickupCity: {
    type: String,
    required: true
  },
  pickupState: {
    type: String,
    required: true
  },
  pickupZip: {
    type: Number,
    required: true
  },
  dropOffStreet: {
    type: String,
    required: true
  },
  dropOffCity: {
    type: String,
    required: true
  },
  dropOffState: {
    type: String,
    required: true
  },
  dropOffZip: {
    type: Number,
    required: true
  },

  booker: {
        type: Schema.Types.ObjectId,
        ref: "User"
  }

}, {
  timestamps: true
});

module.exports = mongoose.model("Booking", BookingSchema);

路线

const express = require("express");
const router = express.Router();
const catchAsync = require("../utilities/catchAsync");
const ExpressError = require("../utilities/expressError");
const Booking = require("../models/booking");
const Joi = require("joi");
const {isLoggedIn} = require("../middleware/index");
const User = require("../models/user");
const mongoose = require("mongoose");

router.get("/booking/:id", catchAsync(async (req, res) => {
  const booking = await Booking.findById(req.params.id).populate("booker");
  console.log(booking);
  if (!booking) {
        req.flash("error", "Cannot find that booking");
        return res.redirect("/booking");
    }
  res.render("booking/show", {booking});
}));


因此,当我在填充后控制台记录“预订”时,用户没有显示任何信息 日志上的模型。

1 个答案:

答案 0 :(得分:0)

除非传递回调或您显式调用 execPopulate(),否则不会发生填充。第二次传递相同的路径将覆盖之前的路径选项。有关选项的说明,请参阅 Model.populate()。

代码更新:populate("booker").exec();

const booking = await Booking.findById(req.params.id).populate("booker").exec();

More info here