wake-up-neo.com

So schreiben Sie ein Mongoose-Modell in ES6/ES2015

Ich möchte mein Mungo-Modell in ES6 schreiben. Ersetzen Sie module.exports und andere ES5-Dinge grundsätzlich, wo immer dies möglich ist. Hier ist was ich habe.

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)

Ich sehe diesen Fehler in der Konsole.

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

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

Ich bin nicht sicher, warum Sie in diesem Fall versuchen, ES6-Klassen zu verwenden. mongoose.Schema ist ein Konstruktor zum Erstellen neuer Schemas. Wenn Sie das tun

var Blacklist = mongoose.Schema({});

sie erstellen ein neues Schema mit diesem Konstruktor. Der Konstruktor ist so konzipiert, dass er sich genau so verhält

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

Was Sie alternativ sind,

class Blacklist extends mongoose.Schema {

sie erstellen zwar eine Unterklasse der Schemaklasse, die Sie jedoch niemals irgendwo instanziieren

Das müsstest du tun

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

aber ich würde es nicht wirklich empfehlen. Es gibt nichts "mehr ES6y" über das, was Sie tun. Der vorherige Code ist absolut sinnvoll und ist die empfohlene API für Mongoose.

13
loganfsmyth

Warum möchtest du es tun? Es wird nicht erwartet, dass mongoose.Schema auf diese Weise verwendet wird. Es verwendet keine Vererbung.

mongoose.Schema ist ein Konstruktor, der ein Objekt sowohl in ES5 als auch in ES6 als ersten Parameter verwendet. Keine Notwendigkeit für ES6-Klassen hier. 

So ist auch mit ES6 der richtige Weg:

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

Um die ES6 klassenähnlich auszuführen, musste die Klasse einfach mit new in der exportierten mongoose.model-Funktion aufgerufen werden.

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

Mongoose kann es6 Klassen nativ unterstützen (seit 4.7 und ohne Transpiler ...).

Einfach schreiben:

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

Für diejenigen, die diese Suche finden, scheint mir die ursprüngliche Frage ziemlich zutreffend zu sein. Ich verwende Babel, das ES6 + auf 5 reduziert. Meine benutzerdefinierten Mongo-Methoden passten nicht gut zu meinem async/await-Code in meiner Klasse. In meinen Instanzmethoden war thisnull. Mit der hier bereitgestellten Lösung konnte ich zu dieser Lösung gelangen, die hoffentlich anderen beim Suchen hilft. 

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

Das wird funktionieren:

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