Узел / Экспресс / Пн goose: Попытка настроить внедренный документ в MongoDB, получая «невозможно переписать модель ###» после компиляции » - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь настроить маршрутизацию для симулируемого «проката» бизнеса в Node, используя express и mon goose.

Мой бэкэнд пока работает отлично, так что я могу сохранять клиентов, фильмы и так далее в базе данных. Однако, когда я пытаюсь подключить маршрутизацию для аренды, я получаю эту ошибку:

сообщение: «Невозможно перезаписать Customer модель после компиляции.»,

I Я полагаю, что проблема связана с моей попыткой внедрить данные клиента в арендный документ, но я не уверен.

Код проблемы:

const { Rental, validateRental } = require("../Models/rental");
const { Movies } = require("../Models/movie");
const { Customers } = require("../Models/customer");
const express = require("express");
const router = express.Router();

////////////////////
//! [C]-RUD
////////////////////

router.post("/", async (req, res) => {
  const { error } = validateRental(req.body);
  if (error) return res.status(400).send(error.details[0].message);

  const customer = await Customers.findById(req.body.customerId);
  if (!customer) return res.status(400).send("Invalid customer.");

  const movie = await Movies.findById(req.body.movieId);
  if (!movie) return res.status(400).send("Invalid movie.");

  if (movie.numberInStock === 0)
    return res.status(400).send("Movie not in stock.");

  let rental = new Rental({
    renter: {
      _id: customer._id,
      name: customer.name,
      phone: customer.phone
    },
    movie: {
      _id: movie._id,
      title: movie.title,
      dailyRentalRate: movie.dailyRentalRate
    }
  });
  rental = await rental.save();

  movie.numberInStock--;
  movie.save();

  res.send(rental);
});

////////////////////////
//! Exports
////////////////////////
module.exports = router;

И мои арендные платы goose Модель выглядит так:

const Rentals = mongoose.model(
  "Rental",
  new mongoose.Schema({
    renter: {
      type: new mongoose.Schema({
        name: {
          type: String,
          required: true,
          minlength: 5,
          maxlength: 50
        },
        isGold: {
          type: Boolean,
          default: false
        },
        phone: {
          type: String,
          required: true,
          minlength: 5,
          maxlength: 50
        }
      }),
      required: true
    },
    movie: {
      type: new mongoose.Schema({
        title: {
          type: String,
          required: true,
          trim: true,
          minlength: 5,
          maxlength: 255
        },
        dailyRentalRate: {
          type: Number,
          required: true,
          min: 0,
          max: 255
        }
      }),
      required: true
    },
    dateOut: {
      type: Date,
      required: true,
      default: Date.now
    },
    dateReturned: {
      type: Date
    },
    rentalFee: {
      type: Number,
      min: 0
    }
  })
); 

Наконец-то мой клиент. js выглядит так:

const mongoose = require("mongoose");
const Joi = require("@hapi/joi");
const CustomJoi = Joi.extend(require("joi-phone-number"));

// * ----------  PRE VALIDATE CUSTOMER NAME and PHONE NUMBER ----------
function validateCustomer(customer) {
  const schema = CustomJoi.object({
    name: CustomJoi.string()
      .min(2)
      .max(30)
      .trim()
      .required(),
    phone: CustomJoi.string()
      .phoneNumber({ defaultCountry: "US", strict: true })
      .trim()
      .required(),
    isGold: CustomJoi.boolean()
  });

  return schema.validate(customer);
}

const customerSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 2,
    maxlength: 30,
    trim: true
  },
  phone: {
    type: String,
    required: true,
    trim: true,
    minlength: 5,
    maxlength: 50
  },
  isGold: {
    type: Boolean,
    default: false
  }
});

//* Define customers model (moved the schema declaration into it.)
const Customers = mongoose.model("Customer", customerSchema);

exports.Customers = Customers;
exports.validate = validateCustomer;

1 Ответ

0 голосов
/ 05 марта 2020

Хорошо, после тестирования вещей в течение дня, похоже, что ответ, который я в итоге использовал, поместив всю декларацию модели в try / catch, казалось, добился цели без очевидных побочных эффектов. Я не проводил анализ производительности, но это все равно выходит за рамки моего урока, и я рассмотрю его в будущем.

let Customers;
 try { Customers = mongoose.model("Customer");
 } catch (error) {
 Customers = mongoose.model("Customer", customerSchema);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...