Je veux écrire mon modèle mangouste dans ES6. En gros, remplacez module.exports
et les autres objets ES5 dans la mesure du possible. Voici ce que j'ai.
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)
Je vois cette erreur dans la console.
if (!('pluralization' in schema.options)) schema.options.pluralization = this.options.pluralization;
^
TypeError: Cannot use 'in' operator to search for 'pluralization' in undefined
Je ne suis pas sûr de savoir pourquoi vous essayez d'utiliser les classes ES6 dans ce cas. mongoose.Schema
est un constructeur permettant de créer de nouveaux schémas. Quand tu fais
var Blacklist = mongoose.Schema({});
vous créez un nouveau schéma à l'aide de ce constructeur. Le constructeur est conçu pour se comporter exactement comme
var Blacklist = new mongoose.Schema({});
Qu'est-ce que vous êtes alternatif,
class Blacklist extends mongoose.Schema {
ne crée une sous-classe de la classe de schéma, mais ne l'instancie jamais nulle part
Vous auriez besoin de faire
export default mongoose.model('Blacklist', new Blacklist());
mais je ne le recommanderais pas vraiment. Il n'y a rien "de plus ES6y" dans ce que vous faites. Le code précédent est parfaitement raisonnable et constitue l’API recommandée pour Mongoose.
Pourquoi voudriez-vous le faire? mongoose.Schema
ne devrait pas être utilisé de cette manière. Il n'utilise pas l'héritage.
mongoose.Schema
est un constructeur qui prend un objet comme premier paramètre à la fois dans ES5 et ES6. Pas besoin de cours ES6 ici.
Ainsi, même avec ES6, le bon moyen consiste à avoir:
const Blacklist = mongoose.Schema({
type: String,
ip: String,
details: String,
reason: String,
});
Pour faire les choses à la manière d'une classe ES6, comme le dit la question, je devais simplement appeler la classe avec new
dans la fonction exportée mongoose.model
.
export default mongoose.model('Blacklist', new Blacklist)
Mongoose peut supporter nativement les classes es6 (depuis 4.7, sans transcripteur…).
Ecrivez:
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');
Pour ceux qui trouvent cette recherche autour, la question initiale me semble assez valable. J'utilise Babel pour transpiler ES6 + jusqu'à 5. Mes méthodes de mangouste personnalisées ne fonctionnaient pas bien avec mon code async/wait dans ma classe d'appel. Notamment, this
était null
dans mes méthodes d'instance. En utilisant la solution fournie ici, j'ai pu arriver à cette solution qui, espérons-le, aidera les autres à effectuer des recherches.
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)
Cela fonctionnera:
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);