2016-01-01 9 views
12

私はマングースモデルをES6に書いています。可能であれば、基本的にmodule.exportsと他のES5を置き換えてください。ここに私が持っているものがあります。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) 

コンソールでこのエラーが表示されます。

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

答えて

8

なぜあなたはそれをしたいですか? mongoose.Schemaは、この方法では使用されません。これは継承を使用しません。

mongoose.Schemaは、ES5とES6の両方のオブジェクトを最初のパラメータとして使用するコンストラクタです。 ES6クラスは必要ありません。

このようにしてもES6との適切な方法は、持っていることです。

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

私はなぜあなたがこのケースで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」はありません。前のコードは完全に合理的で、Mongooseの推奨APIです。

5

ものにES6、クラスのような方法を行うには、質問の状態として、私は単純にエクスポートmongoose.model機能にnewを持つクラスを呼び出す必要がありました。

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

この検索をお探しの方には、元の質問は私にはかなり有効です。私はバベルのES6 +を5まで下げて使用しています。私のカスタムmongooseメソッドは、自分の非同期/呼び出し待ちのコードでうまく動かなかった。特に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) 
2

モンゴースcan natively support es6 classes(4.7以降、およびトランスパイラーなし)。

だけ書く:

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'); 
関連する問題