22

尝试在 Mongoose 中创建模型时出现以下错误

[TypeError:无法读取未定义的属性“选项”]

我不知道是什么原因造成的

"use strict";
var Step = require('step');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

function randomFunction() {
    var categorySchema = new Schema({
        id: Number,
        name: String,
        description: String
    }, { collection: 'categories' });

    var Category;

    //...

    mongoose.connect('mongodb://localhost/grouping');

    new Step(
        function() { //Connect to mongodb
            var db = mongoose.connection;
            db.on('error', console.error.bind(console, 'connection error:'));
            db.on('open', this);
        },
        function() {  //Create model
            console.log(categorySchema); //Logs the schema object right
            Category = mongoose.Model('Category', categorySchema);


        },
        function(err) {
            console.log(err);  //Error here
        });
    //...
}

我对 Mongo 很陌生(对节点也很陌生),但我完全不知道错误消息的含义。

我知道我在架构中定义了选项,但我看不出它是如何未定义的,有人能指出我正确的方向吗?

注意 - 这是原始代码的一个很大的删减,这是一般结构(实际上下面有一些代码mongoose.Model('Cat...但它被跳过了,我认为是因为错误是由调用引发的,因为在它之后mongoose.Model甚至没有console.log("Hello");直接打印 a 。

编辑 我发现在 Mongoose (mongoose/lib/document.js) 内部尝试获取this.schema但未定义

function Document (obj, fields, skipId) { //Line 37
    this.$__ = new InternalCache;
    this.isNew = true;
    this.errors = undefined;

    var schema = this.schema; //-> undefined
    // ...
4

3 回答 3

86

原来我不是那种善于观察的人,

mongoose.Model应该mongoose.model

于 2013-04-06T13:06:33.940 回答
3

调用它也会得到同样的错误。

MyModel = new mongoose.model('<your model name>', mySchema)

如果您确实删除了新的。

于 2014-07-18T04:09:20.010 回答
1

在 Promise 链中使用模型方法时也会显示此错误消息,例如:

const Product = mongoose.model('Product', ProductSchema)

ScrapProducts()
  .then(mapToModel)
  .then(Product.create)

要解决它,您必须确保您的猫鼬模型保留其原始上下文。

const Product = mongoose.model('Product', ProductSchema)

ScrapProducts()
  .then(mapToModel)
  .then(function(data) {
    return Product.create(data)
  })

或更好:

const Product = mongoose.model('Product', ProductSchema)

ScrapProducts()
  .then(mapToModel)
  .then(Product.create.bind(Product))
于 2017-11-22T15:25:25.960 回答