web-dev-qa-db-ja.com

ES6 / ES2015でマングースモデルを作成する方法

ES6でマングースモデルを書きたいのですが。基本的にmodule.exportsおよびその他のES5のものは可能な限り。これが私が持っているものです。

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
16
Noah

この場合、なぜ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です。

15
loganfsmyth

なぜそれをしたいのですか? mongoose.Schemaはこのように使用することは想定されていません。継承は使用しません。

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

したがって、ES6を使用しても、適切な方法は次のようになります。

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

Mongoose es6クラスをネイティブでサポートできます (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');
6
vinyll

ES6をクラスのように行うには、質問のとおり、エクスポートされたmongoose.model関数でnewを使用してクラスを呼び出すだけで済みます。

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

このような検索を見つけた人にとって、元の質問は私にとってかなり有効なようです。 ES6 +から5までのバベルトランスパイルを使用しています。カスタムのマングースメソッドは、呼び出しクラスの非同期/待機コードでうまく機能しませんでした。特に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)
4
David

これは動作します:

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