Как использовать прототипы в NodeJS MVC - пытаясь добавить значение переменной модели по умолчанию, используя функцию прототипа - PullRequest
0 голосов
/ 19 мая 2018

Я относительно новичок в Node JS - искал много источников, потратил больше суток - не повезло.

У меня есть обычное приложение NodeJS, использующее модель Mongoose, Маршруты и контроллеры.

Ниже моя модель и как я создаю новый объект в Контроллере.

КАК И ГДЕ МОЖНО НАЗНАЧАТЬ ЗНАЧЕНИЕ bookingNumber ИСПОЛЬЗУЯ ФУНКЦИЮ ПРОТОТИПА?Предположим, гость останавливается в курортном отеле и в настоящее время находится в процессе бронирования процедуры SPA.Номер бронирования курортного отеля (уникальный для этого гостя) должен быть прикреплен ко всем сделанным заказам SPA.

// MODEL TO BOOK SPA PROCEDURE FOR A HOTEL GUEST
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var Users_BookingSchema = new Schema({
    bookingname: {type: String, required: true, unique: true, min: 3, max: 100},
    // reservationNumber:  {type: String},      // NEEDS TO BE ASSIGNED USING PROTOTYPE
    starttime: {type: Date, required: true},
    endtime : {type: Date, required: true}
});

Users_BookingSchema
    .virtual('url')
    .get(function () {
  return '/users_booking/'+this._id;
});

module.exports = mongoose.model('Users_Booking', Users_BookingSchema);

И ОТ КОНТРОЛЛЕРА:

// PART OF FUNCTION SAVING HOTEL SPA PROCEDURE BOOKING - create on POST
var sbt = new Users_Booking({ 
  bookingname : req.body.bname,
  starttime : jsDateStart,  // PARSED DATE IS ASSIGNED
  endtime : jsDateEnd   // PARSED DATE IS ASSIGNED
  // could add code below here - but trying to use prototype
});

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

  let resNumb = getReservationNumber();
  reservationNumber: resNumb;

, но я пытаюсь узнать, как я могу применить ПРОТОТИПЫ для достижения этой цели:

Я НЕ думаю, что мне нужно добавить следующую функцию в файл моделикак Users_Booking НЕ ОПРЕДЕЛЕН

Users_Booking.prototype.reservationNumber = function() {
    return "4236";  // ASSUME THIS RETURNS RESERVATION NUMBER UNIQUE  TO GUEST BEFORE MAKING A SPA PROCEDURE BOOKING
}

Я вообще в правильном направлении?

1 Ответ

0 голосов
/ 19 мая 2018

Интересная идея.С классом Users_Booking, созданным из mongoose, теперь вы можете ссылаться на Users_Booking с функциональностью класса mongoose (все методы, описанные в документации mongoose) и Object () (базовый прототип JavaScript) ,Оба наследуются для Users_Booking.Вот несколько доказательств:

const Users_Booking = mongoose.model('Users_Booking',  Users_Booking_Schema);

console.log(Users_Booking.__proto__); // outputs all of the native mongoose methods
console.log(Object().__proto__.isPrototypeOf(Users_Booking.__proto__.__proto__)); // 'true'

Если вы хотите добавить ко всему этому функцию getReservationNumber (), вы определенно можете это сделать.Я бы предпочел это: const Users_Booking = module.exports = mongoose.model(/* ... */);.Ниже этого экспорта / определения вы можете определить другие служебные методы, которые будут сопровождать Users_Booking при его импорте.Что-то вроде приведенного ниже кода:

const mongoose = require('mongoose');

// ... definition of Users_Booking_Schema ...

const Users_Booking = module.exports = mongoose.model('Users_Booking', Users_Booking_Schema);

module.exports.generateUniqueReservationNumber() {
    // generate a unique booking id
    return booking_uid;
}

// ... any other utility functions ...

Нет необходимости связываться с прототипом.Поскольку Users_Booking является собственной ссылкой на коллекцию, вы можете просто добавить функциональность прямо под ее определением / экспортом в тот же файл.Таким образом вы можете хранить свой код в инкапсуляции, и вам не нужно будет связываться с прототипом.

Так что да, добавление к прототипу может работать (всегда рекомендуется тестирование) .Я считаю, что метод, описанный выше, лучше подойдет для вашей программы.

...