2016-01-01 10 views
12

Voglio scrivere il mio modello di mangusta in ES6. Sostanzialmente sostituire module.exports e altre cose ES5 ovunque sia possibile. Ecco quello che ho.Come scrivere un modello Mongoose 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) 

Vedo questo errore nella console.

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 (NomeClasse) http://mongoosejs.com/docs/advanced_schemas.html –

risposta

8

Perché vuoi farlo? mongoose.Schema non dovrebbe essere utilizzato in questo modo. Non usa l'ereditarietà.

mongoose.Schema è un costruttore che accetta un oggetto come primo parametro sia in ES5 che in ES6. Non c'è bisogno di classi ES6 qui.

Così, anche con ES6 il modo corretto è quello di avere:

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

Io non so perché si sta tentando di utilizzare le classi ES6 in questo caso. mongoose.Schema è un costruttore per creare nuovi schemi. Quando lo fai

var Blacklist = mongoose.Schema({}); 

stai creando un nuovo schema usando quel costruttore. Il costruttore è stato progettato in modo che si comporta esattamente come

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

Cosa sei alternativa,

class Blacklist extends mongoose.Schema { 

fa è creare una sottoclasse della classe di schema, ma mai effettivamente istanziare ovunque

Avresti bisogno di fare

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

ma non lo consiglio davvero. Non c'è niente di "ES6y" su ciò che stai facendo. Il codice precedente è perfettamente ragionevole ed è l'API consigliata per Mongoose.

5

Per fare le cose con la classe ES6, come in una domanda, ho semplicemente dovuto richiamare la classe con nella funzione esportata mongoose.model.

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

Per chi trova questa ricerca in giro, la domanda originale mi sembra abbastanza valida. Sto usando Babel che traspone ES6 + fino a 5. I miei metodi di mangusta personalizzati non hanno funzionato bene con il mio codice asincrono/attesa nella mia classe chiamante. In particolare this era null nei miei metodi di istanza. Usando la soluzione fornita qui, sono riuscito ad arrivare a questa soluzione che, auspicabilmente, aiuta gli altri a cercare in giro.

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 (dal 4,7, e senza transpiler ...).

Basta scrivere:

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'); 
Problemi correlati