Javascript 如何在ES6/ES2015中编写猫鼬模型
我想用ES6编写我的猫鼬模型。基本上更换Javascript 如何在ES6/ES2015中编写猫鼬模型,javascript,node.js,mongoose,ecmascript-6,Javascript,Node.js,Mongoose,Ecmascript 6,我想用ES6编写我的猫鼬模型。基本上更换模块。尽可能导出和其他ES5内容。这是我的 import mongoose from 'mongoose' class Blacklist extends mongoose.Schema { constructor() { super({ type: String, ip: String, details: String, reason: String }) } } export
模块。尽可能导出和其他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
你为什么要这么做mongoose.Schema
不应以这种方式使用。它不使用继承
mongoose.Schema
是一个构造函数,在ES5和ES6中都将对象作为第一个参数。这里不需要ES6课程
因此,即使使用ES6,正确的方法是:
const Blacklist = mongoose.Schema({
type: String,
ip: String,
details: String,
reason: String,
});
我不知道在这种情况下为什么要尝试使用ES6类<模式
是创建新模式的构造函数。当你这样做的时候
var Blacklist = mongoose.Schema({});
您正在使用该构造函数创建一个新架构。构造函数的设计使其行为与
var Blacklist = new mongoose.Schema({});
你的选择
class Blacklist extends mongoose.Schema {
确实是创建了schema类的子类,但实际上从未在任何地方实例化它
你需要这样做
export default mongoose.model('Blacklist', new Blacklist());
但我并不真的推荐它。对于你正在做的事情,没有什么比这更令人厌烦的了。前面的代码非常合理,是Mongoose的推荐API。要以ES6类的方式进行操作,正如问题所述,我只需在导出的Mongoose.model
函数中使用new
调用该类即可
export default mongoose.model('Blacklist', new Blacklist)
对于那些四处寻找的人来说,最初的问题对我来说似乎非常有效。我正在使用Babel将ES6+转换为5。我的自定义mongoose方法在调用类中不能很好地处理异步/等待代码。值得注意的是,这个
在我的实例方法中是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.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');
这将有助于:
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);
这可能是迟到的答复仍然,这可能有助于谁寻找这个人
对于ES6类,模式有一个loadClass()
方法,可用于从ES6类创建Mongoose模式:
class MyClass {
myMethod() { return 42; }
static myStatic() { return 42; }
get myVirtual() { return 42; }
}
const schema = new mongoose.Schema();
schema.loadClass(MyClass);
console.log(schema.methods); // { myMethod: [Function: myMethod] }
console.log(schema.statics); // { myStatic: [Function: myStatic] }
console.log(schema.virtuals); // { myVirtual: VirtualType { ... } }
- ES6类方法成为Mongoose方法
- ES6类静态成为Mongoose静态
- ES6的接受者和接受者变成了猫鼬
下面是使用loadClass()从ES6类创建架构的示例:
class MyClass {
myMethod() { return 42; }
static myStatic() { return 42; }
get myVirtual() { return 42; }
}
const schema = new mongoose.Schema();
schema.loadClass(MyClass);
console.log(schema.methods); // { myMethod: [Function: myMethod] }
console.log(schema.statics); // { myStatic: [Function: myStatic] }
console.log(schema.virtuals); // { myVirtual: VirtualType { ... } }
参考:这是mongoose文档中的示例代码,有关架构的更多详细信息schema。mongoose架构的loadClass(ClassName)检查不起作用,我抛出了一个MissingSchemaError!