Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Node.js Mongoose:调用另一个模式的静态方法返回;TypeError:对象没有方法';xxx和x27&引用;_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose:调用另一个模式的静态方法返回;TypeError:对象没有方法';xxx和x27&引用;

Node.js Mongoose:调用另一个模式的静态方法返回;TypeError:对象没有方法';xxx和x27&引用;,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,在我的节点项目中,我定义了一个dog模式和一个cat模式 架构相同(名称/年龄) 两个模式都有一个静态方法sayHello。cat schame有一个实例方法let_dog_speak,它将触发dog模式的sayHello,let_cat_speak也是如此 在我的路由处理程序中,当我试图获取一个dog实例(/getdog/:name)时,将触发cat的sayHello方法,反之亦然 问题是我的猫能让狗说话,而狗不能。我在下面附上了我的代码和错误信息 /model/cat.js var Dog

在我的节点项目中,我定义了一个dog模式和一个cat模式

架构相同(名称/年龄)

两个模式都有一个静态方法sayHello。cat schame有一个实例方法let_dog_speak,它将触发dog模式的sayHello,let_cat_speak也是如此

在我的路由处理程序中,当我试图获取一个dog实例(/getdog/:name)时,将触发cat的sayHello方法,反之亦然

问题是我的猫能让狗说话,而狗不能。我在下面附上了我的代码和错误信息

/model/cat.js

var Dog = require('./dog');

var Cat = new Schema({
    name: { type:String, required:true, trim:true },
    age: { type:Number, required:true, trim:true }
});

Cat.statics.sayHello = function() {
    console.log("Meow meow");
};

Cat.methods.let_dog_speak = function() {
    Dog.sayHello();
};

var cat_model = testdb.model('cat_collection', Cat);
module.exports = cat_model;
var Cat = require('./cat');

var Dog = new Schema({
    name: { type: String, required: true, trim: true },
    age: { type: Number, required:true, trim:true },
});

Dog.statics.sayHello = function() {
    console.log("Wow wow");
};

Dog.methods.let_cat_speak = function() {
    Cat.sayHello();
};

var dog_model = testdb.model('dog_collection', Dog);
module.exports = dog_model;
app.get('/getdog/:name', function(req, res) {
    Dog.findOne({
        name: req.params.name
    }, function(error, dog) {
        dog.let_cat_speak(); //This throws error
        res.json(dog);
    });
});

app.get('/getcat/:name', function(req, res) {
    Cat.findOne({
        name: req.params.name,
    }, function(error, cat) {
        cat.let_dog_speak(); //This works, will print wow wow 
        res.json(cat);
    });
});
/model/dog.js

var Dog = require('./dog');

var Cat = new Schema({
    name: { type:String, required:true, trim:true },
    age: { type:Number, required:true, trim:true }
});

Cat.statics.sayHello = function() {
    console.log("Meow meow");
};

Cat.methods.let_dog_speak = function() {
    Dog.sayHello();
};

var cat_model = testdb.model('cat_collection', Cat);
module.exports = cat_model;
var Cat = require('./cat');

var Dog = new Schema({
    name: { type: String, required: true, trim: true },
    age: { type: Number, required:true, trim:true },
});

Dog.statics.sayHello = function() {
    console.log("Wow wow");
};

Dog.methods.let_cat_speak = function() {
    Cat.sayHello();
};

var dog_model = testdb.model('dog_collection', Dog);
module.exports = dog_model;
app.get('/getdog/:name', function(req, res) {
    Dog.findOne({
        name: req.params.name
    }, function(error, dog) {
        dog.let_cat_speak(); //This throws error
        res.json(dog);
    });
});

app.get('/getcat/:name', function(req, res) {
    Cat.findOne({
        name: req.params.name,
    }, function(error, cat) {
        cat.let_dog_speak(); //This works, will print wow wow 
        res.json(cat);
    });
});
这是我的路线,/route.js

var Dog = require('./dog');

var Cat = new Schema({
    name: { type:String, required:true, trim:true },
    age: { type:Number, required:true, trim:true }
});

Cat.statics.sayHello = function() {
    console.log("Meow meow");
};

Cat.methods.let_dog_speak = function() {
    Dog.sayHello();
};

var cat_model = testdb.model('cat_collection', Cat);
module.exports = cat_model;
var Cat = require('./cat');

var Dog = new Schema({
    name: { type: String, required: true, trim: true },
    age: { type: Number, required:true, trim:true },
});

Dog.statics.sayHello = function() {
    console.log("Wow wow");
};

Dog.methods.let_cat_speak = function() {
    Cat.sayHello();
};

var dog_model = testdb.model('dog_collection', Dog);
module.exports = dog_model;
app.get('/getdog/:name', function(req, res) {
    Dog.findOne({
        name: req.params.name
    }, function(error, dog) {
        dog.let_cat_speak(); //This throws error
        res.json(dog);
    });
});

app.get('/getcat/:name', function(req, res) {
    Cat.findOne({
        name: req.params.name,
    }, function(error, cat) {
        cat.let_dog_speak(); //This works, will print wow wow 
        res.json(cat);
    });
});
错误消息:

TypeError: Object #<Object> has no method 'sayHello'
    at model.Dog.methods.let_cat_speak (/home/sliter/Development/nodeJS/mongotest/backend/model/dog.js:16:9)
TypeError:对象#没有方法“sayHello”
在model.Dog.methods.let_cat_speak(/home/slitter/Development/nodeJS/mongotest/backend/model/Dog.js:16:9)

这可能是因为cat.js和dog.js之间的循环引用。将它们放在同一个文件中,然后再试一次。多亏了@sza,通过集成这两个文件解决了这个问题。此外,我还发现了这个链接,它解释了问题的原因。简言之,正是nodejs禁止引用循环。为了保留两个文件,将require('./dog | cat')语句替换为mongoose.model('dog | cat| collection')将使代码正常工作。不客气,我很高兴您解决了问题。