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
この場合、なぜ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です。
なぜそれをしたいのですか? mongoose.Schema
はこのように使用することは想定されていません。継承は使用しません。
mongoose.Schema
は、ES5とES6の両方でオブジェクトを最初のパラメーターとして使用するコンストラクターです。ここではES6クラスは必要ありません。
したがって、ES6を使用しても、適切な方法は次のようになります。
const Blacklist = mongoose.Schema({
type: String,
ip: String,
details: String,
reason: String,
});
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');
ES6をクラスのように行うには、質問のとおり、エクスポートされたmongoose.model
関数でnew
を使用してクラスを呼び出すだけで済みます。
export default mongoose.model('Blacklist', new Blacklist)
このような検索を見つけた人にとって、元の質問は私にとってかなり有効なようです。 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)
これは動作します:
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);