Как написать модель Mongoose в 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
Ответы
Ответ 1
Я не уверен, почему вы пытаетесь использовать классы 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" о том, что вы делаете. Предыдущий код является совершенно разумным и является рекомендуемым API для Mongoose.
Ответ 2
Зачем вам это делать? mongoose.Schema
, как ожидается, не будет использоваться таким образом. Он не использует наследование.
mongoose.Schema
- это конструктор, который воспринимает объект как первый параметр как в ES5, так и в ES6. Здесь нет необходимости в классах ES6.
Таким образом, даже с ES6 правильным способом является:
const Blacklist = mongoose.Schema({
type: String,
ip: String,
details: String,
reason: String,
});
Ответ 3
Чтобы сделать что-то вроде ES6, как у класса, я просто должен был вызвать класс с new
в экспортируемой функции mongoose.model
.
export default mongoose.model('Blacklist', new Blacklist)
Ответ 4
Для тех, кто находит этот поиск, исходный вопрос кажется для меня действительно верным. Я использую Babel transpiling ES6 + до 5. Мои пользовательские методы мангуста не очень хорошо играли с моим кодом async/wait в моем вызывающем классе. Примечательно, что 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)
Ответ 5
Mongoose может изначально поддерживать классы es6 (начиная с 4.7 и без transpiler...).
Просто напишите:
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
Это будет работать:
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);