Подтвердить что ты не робот

Как написать модель Mongoose в ES6/ES2015

Я хочу написать мою модель мангуста в ES6. В основном замените module.exports и другие ES5, где это возможно. Вот что я имею.

import mongoose from 'mongoose'

class Blacklist extends mongoose.Schema {
  constructor() {
    super({
      type: String,
      ip: String,
      details: String,
      reason: String
    })
  }
}

export default mongoose.model('Blacklist', Blacklist)

Я вижу эту ошибку в консоли.

if (!('pluralization' in schema.options)) schema.options.pluralization = this.options.pluralization;
                                 ^

TypeError: Cannot use 'in' operator to search for 'pluralization' in undefined
4b9b3361

Ответ 1

Я не уверен, почему вы пытаетесь использовать классы ES6 в этом случае. mongoose.Schema является конструктором для создания новых схем. Когда вы делаете

var Blacklist = mongoose.Schema({});

вы создаете новую схему, используя этот конструктор. Конструктор спроектирован так, что ведет себя точно так же, как

var Blacklist = new mongoose.Schema({});

Что вы альтернативы,

class Blacklist extends mongoose.Schema {

действительно создает подкласс класса схемы, но вы никогда его не создаете где-либо

Вам нужно будет сделать

export default mongoose.model('Blacklist', new Blacklist());

но я бы не рекомендовал его. Там ничего "больше ES6y" о том, что вы делаете. Предыдущий код является совершенно разумным и является рекомендуемым API для Mongoose.

Ответ 2

Зачем вам это делать? mongoose.Schema, как ожидается, не будет использоваться таким образом. Он не использует наследование.

mongoose.Schema - это конструктор, который воспринимает объект как первый параметр как в ES5, так и в ES6. Здесь нет необходимости в классах ES6.

Таким образом, даже с ES6 правильным способом является:

const Blacklist = mongoose.Schema({
  type: String,
  ip: String,
  details: String,
  reason: String,
});

Ответ 3

Чтобы сделать что-то вроде ES6, как у класса, я просто должен был вызвать класс с new в экспортируемой функции mongoose.model.

export default mongoose.model('Blacklist', new Blacklist)

Ответ 4

Для тех, кто находит этот поиск, исходный вопрос кажется для меня действительно верным. Я использую Babel transpiling ES6 + до 5. Мои пользовательские методы мангуста не очень хорошо играли с моим кодом async/wait в моем вызывающем классе. Примечательно, что this был null в моих методах экземпляра. Используя предоставленное здесь решение, я смог прийти к этому решению, которое, как мы надеемся, поможет другим в поиске.

import mongoose from 'mongoose'

class Tenant extends mongoose.Schema {
  constructor() {
    const tenant = super({
      pg_id: Number,
      name: String,
      ...
    })

    tenant.methods.getAccountFields = this.getAccountFields
    tenant.methods.getCustomerTypes = this.getCustomerTypes
    tenant.methods.getContactFields = this.getContactFields
    ...
    tenant.methods.getModelFields = this.getModelFields

    return tenant
  }

  getAccountFields() {
    return this.getModelFields(this.account_fields_mapping)
  }

  getCustomerTypes() {
    //code
  }

  getContactFields() {
    //code
  }

  ...

  getModelFields(fields_mapping) {
    //code
  }
}

export default mongoose.model('Tenant', new Tenant)

Ответ 5

Mongoose может изначально поддерживать классы es6 (начиная с 4.7 и без transpiler...).

Просто напишите:

const mongoose = require('mongoose')
const { Model, Schema } = mongoose

const schema = new Schema({
  type: String,
  ip: String,
  details: String,
  reason: String,
})

class Tenant extends Model {}

module.exports = mongoose.model(Tenant, schema, 'tenant');

Ответ 6

Это будет работать:

import mongoose from 'mongoose';

const { Schema } = mongoose;
const userSchema = new Schema({

  email: {
      type: String,
      required: true
  },
  firstName: {
      type: String,
  },
  lastName: {
      type: String
  },
  age: {
      type: Number
  }
});

export default mongoose.model('User', userSchema);