Как я могу получить доступ к модели Mongoose из статической функции? - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь определить функцию statics с именем convertFromCartItems, которая принимает массив моделей типа CartItem, создает массив моделей типа OrderItem, а затем вставляет их в одну операцию, используяMongoDB insertMany().Моя текущая функция для создания Order из Cart (родительские модели, на которые указывают соответственно OrderItem и CartItem) выглядит следующим образом:

  schema.statics.convertFromCart = function (cart, shipping, then, unless) {
    let order = new this()
    order._cart = cart
    order.firstName = shipping.firstName
    order.lastName = shipping.lastName
    order.email = shipping.email
    order.address = shipping.address
    order.addressCity = shipping.addressCity
    order.addressPostalCode = shipping.addressPostalCode
    order.addressRegionCode = shipping.addressRegionCode
    order.addressCountryCode = shipping.addressCountryCode

    order.save((err, thing) => {
      if (!err && thing) {
        then(thing)
      } else {
        unless(err)
      }
    })
  }

Эта функция вызывает .save()сам по себе, чтобы вызвать его, у меня есть строка, подобная этой:

models.Order.convertFromCart(cart, shipping, (order) => {
  // Do something with the newly created 'Order'
})

Однако в Mongoose (и действительно MongoDB) insertMany() определено на модели, а не на экземпляре, поэтому я хочу сделатьвыглядит примерно так:

schema.statics.convertFromCartItems = function (order, items, then unless) {
  let orderItems = []
  items.forEach((item) => {
    let orderItem = this()
    orderItem._item = item
    orderItem._order = order
    orderItem.quantity = item.quantity
    orderItem.subscribed = item.subscribed
    orderItem.name = item._item._product.name
    orderItem.variation = item._item.variation
    orderItem.price = item._item.price
    orderItem.image = item._item._product.image
    orderItem.created = item.created
    orderItem.updated = item.update
    orderItems.push(orderItem)
  })
  // code I want to use
  OrderItemSchema.insertMany(orderItems, funciton (err, things) {
    if (!err && things) {
      then(things)
    } else {
      unless(err)
    }
  })
}

Однако пока внутри этой функции statics.convertFromCartItems, OrderItemSchema еще не существует.Mongoose использует некоторую хитрость this, чтобы позволить мне создать экземпляр модели, вызывая this(), но this.insertMany() или this().insertMany() не работают (так как insertMany() на модели, а не на экземпляре).Текущий обходной путь - вернуть массив и затем вызвать models.OrderItem.insertMany() для элементов вне этой функции.Любые идеи о том, как я могу заставить эту функцию вставлять себя?

Если это поможет понять, что мне нужно, вот краткий обзор этих двух моделей.У меня есть модель, которая представляет элемент в корзине (CartItem), и я пытаюсь взять их массив и создать массив строк в завершенном порядке (OrderItem) (это похоже на Система двойного учета , позволяющая завершенному заказу иметь моментальный снимок данных в момент получения заказа, в то время как CartItem может указывать на текущее определение таких вещей, как название продукта и цена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...