Ich möchte mein Mungo-Modell in ES6 schreiben. Ersetzen Sie module.exports
und andere ES5-Dinge grundsätzlich, wo immer dies möglich ist. Hier ist was ich habe.
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)
Ich sehe diesen Fehler in der Konsole.
if (!('pluralization' in schema.options)) schema.options.pluralization = this.options.pluralization;
^
TypeError: Cannot use 'in' operator to search for 'pluralization' in undefined
Ich bin nicht sicher, warum Sie in diesem Fall versuchen, ES6-Klassen zu verwenden. mongoose.Schema
ist ein Konstruktor zum Erstellen neuer Schemas. Wenn Sie das tun
var Blacklist = mongoose.Schema({});
sie erstellen ein neues Schema mit diesem Konstruktor. Der Konstruktor ist so konzipiert, dass er sich genau so verhält
var Blacklist = new mongoose.Schema({});
Was Sie alternativ sind,
class Blacklist extends mongoose.Schema {
sie erstellen zwar eine Unterklasse der Schemaklasse, die Sie jedoch niemals irgendwo instanziieren
Das müsstest du tun
export default mongoose.model('Blacklist', new Blacklist());
aber ich würde es nicht wirklich empfehlen. Es gibt nichts "mehr ES6y" über das, was Sie tun. Der vorherige Code ist absolut sinnvoll und ist die empfohlene API für Mongoose.
Warum möchtest du es tun? Es wird nicht erwartet, dass mongoose.Schema
auf diese Weise verwendet wird. Es verwendet keine Vererbung.
mongoose.Schema
ist ein Konstruktor, der ein Objekt sowohl in ES5 als auch in ES6 als ersten Parameter verwendet. Keine Notwendigkeit für ES6-Klassen hier.
So ist auch mit ES6 der richtige Weg:
const Blacklist = mongoose.Schema({
type: String,
ip: String,
details: String,
reason: String,
});
Um die ES6 klassenähnlich auszuführen, musste die Klasse einfach mit new
in der exportierten mongoose.model
-Funktion aufgerufen werden.
export default mongoose.model('Blacklist', new Blacklist)
Mongoose kann es6 Klassen nativ unterstützen (seit 4.7 und ohne Transpiler ...).
Einfach schreiben:
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');
Für diejenigen, die diese Suche finden, scheint mir die ursprüngliche Frage ziemlich zutreffend zu sein. Ich verwende Babel, das ES6 + auf 5 reduziert. Meine benutzerdefinierten Mongo-Methoden passten nicht gut zu meinem async/await-Code in meiner Klasse. In meinen Instanzmethoden war this
null
. Mit der hier bereitgestellten Lösung konnte ich zu dieser Lösung gelangen, die hoffentlich anderen beim Suchen hilft.
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)
Das wird funktionieren:
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);