Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在ES6/ES2015中编写猫鼬模型_Javascript_Node.js_Mongoose_Ecmascript 6 - Fatal编程技术网

Javascript 如何在ES6/ES2015中编写猫鼬模型

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

我想用ES6编写我的猫鼬模型。基本上更换
模块。尽可能导出
和其他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!