2016-01-01 16 views
12

ich mein Mungo Modell in ES6 will schreiben schreiben. Grundsätzlich ersetzen module.exports und andere ES5 Dinge, wo immer möglich. Hier ist was ich habe.Wie ein Mungo Modell in ES6/ES2015

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 
+1

schema.loadClass (Classname) http://mongoosejs.com/docs/advanced_schemas.html –

Antwort

8

Warum möchten Sie es tun? mongoose.Schema ist nicht auf diese Weise verwendet werden erwartet. Es verwendet keine Vererbung.

mongoose.Schema ist ein Konstruktor, der ein Objekt als der erste Parameter sowohl in ES5 und ES6 nimmt. Keine Notwendigkeit für ES6-Klassen hier.

So mit ES6 auch dem richtigen Weg ist zu haben:

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

Ich bin mir nicht sicher, warum Sie versuchen, ES6 Klassen in diesem Fall zu verwenden. mongoose.Schema ist ein Konstruktor neue Schemata zu erstellen. Wenn Sie das tun

var Blacklist = mongoose.Schema({}); 

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

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

Was Sie Alternative sind,

class Blacklist extends mongoose.Schema { 

tut, ist eine Unterklasse der Schemaklasse erstellen, aber Sie nie wirklich überall instanziiert

Sie müssten

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

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

5

Um Dinge der ES6, klassenähnliche Art und Weise zu tun, wie die Frage besagt, musste ich einfach die Klasse mit new in der exportierten mongoose.model Funktion aufrufen.

1

Für diejenigen, die diese Suche finden, scheint die ursprüngliche Frage ziemlich gültig für mich. Ich verwende Babel, das ES6 + auf 5 transpiliert. Meine benutzerdefinierten Mungo-Methoden haben mit meinem Async-/Abwarten-Code in meiner Aufrufklasse nicht gut funktioniert. Bemerkenswerter this war null in meinen Instanzmethoden. Mit der hier vorgestellten Lösung konnte ich zu dieser Lösung gelangen, die hoffentlich anderen hilft, sich umzusehen.

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) 
2

Mongoose can natively support es6 classes (seit 4.7 und ohne Transpiler ...).

Schreiben Sie einfach:

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'); 
Verwandte Themen