web-dev-qa-db-fra.com

Comment écrire un modèle Mongoose dans ES6/ES2015

Je veux écrire mon modèle mangouste dans ES6. En gros, remplacez module.exports et les autres objets ES5 dans la mesure du possible. Voici ce que j'ai.

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)

Je vois cette erreur dans la console.

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

TypeError: Cannot use 'in' operator to search for 'pluralization' in undefined
14
Noah

Je ne suis pas sûr de savoir pourquoi vous essayez d'utiliser les classes ES6 dans ce cas. mongoose.Schema est un constructeur permettant de créer de nouveaux schémas. Quand tu fais

var Blacklist = mongoose.Schema({});

vous créez un nouveau schéma à l'aide de ce constructeur. Le constructeur est conçu pour se comporter exactement comme

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

Qu'est-ce que vous êtes alternatif,

class Blacklist extends mongoose.Schema {

ne crée une sous-classe de la classe de schéma, mais ne l'instancie jamais nulle part

Vous auriez besoin de faire

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

mais je ne le recommanderais pas vraiment. Il n'y a rien "de plus ES6y" dans ce que vous faites. Le code précédent est parfaitement raisonnable et constitue l’API recommandée pour Mongoose.

13
loganfsmyth

Pourquoi voudriez-vous le faire? mongoose.Schema ne devrait pas être utilisé de cette manière. Il n'utilise pas l'héritage.

mongoose.Schema est un constructeur qui prend un objet comme premier paramètre à la fois dans ES5 et ES6. Pas besoin de cours ES6 ici. 

Ainsi, même avec ES6, le bon moyen consiste à avoir:

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

Pour faire les choses à la manière d'une classe ES6, comme le dit la question, je devais simplement appeler la classe avec new dans la fonction exportée mongoose.model.

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

Mongoose peut supporter nativement les classes es6 (depuis 4.7, sans transcripteur…).

Ecrivez:

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');
4
vinyll

Pour ceux qui trouvent cette recherche autour, la question initiale me semble assez valable. J'utilise Babel pour transpiler ES6 + jusqu'à 5. Mes méthodes de mangouste personnalisées ne fonctionnaient pas bien avec mon code async/wait dans ma classe d'appel. Notamment, this était null dans mes méthodes d'instance. En utilisant la solution fournie ici, j'ai pu arriver à cette solution qui, espérons-le, aidera les autres à effectuer des recherches. 

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)
4
David

Cela fonctionnera:

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);
0
Dilshan