Nodejs mongoose里面为什么定义了methods方法之后不能用entity调用呢

Nodejs mongoose里面为什么定义了methods方法之后不能用entity调用呢

//user.js var mongodb = require(’…/config/mongodb’); var Schema = mongodb.mongoose.Schema; var ObjectId = Schema.ObjectId; var UserSchema = new Schema({ id : ObjectId, name : String, email : String }); UserSchema.methods.findOneByName = function(name, callback) { this.findOne({name : name}, callback); }; module.exports = mongodb.mongoose.model(‘users’, UserSchema);

//index.js var UserModel = require("./user"); var new_user_entity=new UserModel({}); //here 这里怎么不能用这个方法呢~ ~是不是定义错了啊,求救!0.0 new_user_entity.findOneByName(“zhangsan”,function(err,doc){ if(err){ … }else{ … } });


6 回复

在Node.js中使用Mongoose时,如果你在Schema中定义了methods,那么这些方法应该能够通过实体(entity)来调用。如果遇到无法调用的情况,可能是由于一些常见的错误或误解。下面我将通过示例代码来解释如何正确地定义和使用methods

示例代码

user.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
    id: { type: Schema.Types.ObjectId },
    name: String,
    email: String
});

// 定义一个方法
UserSchema.methods.findOneByName = function (name, callback) {
    this.model('User').findOne({ name: name }, callback);
};

module.exports = mongoose.model('User', UserSchema);

index.js

var UserModel = require("./user");

// 创建一个新的用户实体
var newUserEntity = new UserModel({
    name: "John Doe",
    email: "john.doe@example.com"
});

// 使用findOneByName方法
newUserEntity.findOneByName("John Doe", function (err, doc) {
    if (err) {
        console.error(err);
    } else {
        console.log(doc);
    }
});

解释

  1. 定义方法: 在user.js文件中,我们定义了一个名为findOneByName的方法。这个方法用于根据名称查询用户,并且它通过调用this.model('User')来获取模型实例,然后使用findOne方法进行查询。

  2. 创建实体: 在index.js文件中,我们首先引入了UserModel,然后创建了一个新的用户实体newUserEntity

  3. 调用方法: 我们尝试通过newUserEntity.findOneByName("John Doe", callback)来调用定义好的方法。这里的关键在于确保你已经正确地创建了模型并实例化了实体。

常见问题

  • 拼写错误:确保方法名拼写正确。
  • 上下文问题:确保你在正确的上下文中调用方法。例如,确保this指向的是正确的对象。
  • 回调函数:确保传递的回调函数格式正确。

如果以上步骤都正确执行,你应该能够成功地通过实体调用定义的方法。如果仍然有问题,请检查是否有其他错误信息或配置问题。


有错误信息?

这个方法应该定义在statics

UserSchema.statics.findOneByName = function(name, callback) {
  this.findOne({name : name}, callback);
};

如果要定义实例方法应该这样:

UserSchema.methods.findOneByName = function(name, callback) {
  this.model('users').findOne({name : name}, callback);
};

可是 var new_user_entity=new UserModel({});//这个不就是创建了实例的么0.0,然后调实例methods方法的 这两种方法适应场合是什么呢。。。

并不觉得你这样写有什么错啊,给错误信息看看?

在你的代码中,findOneByName 方法定义在 UserSchema.methods 中,但实际应该通过模型实例来调用这个方法。然而,在 Mongoose 中,定义在 methods 中的方法并不会自动添加到查询方法中。你需要使用 statics 来定义静态方法,这些方法可以直接通过模型来调用。

示例修正后的代码

//user.js

var mongodb = require('../config/mongodb');
var Schema = mongodb.mongoose.Schema;
var ObjectId = Schema.ObjectId;

var UserSchema = new Schema({
    id: ObjectId,
    name: String,
    email: String
});

// 定义静态方法
UserSchema.statics.findOneByName = function(name, callback) {
    return this.findOne({ name: name }, callback);
};

module.exports = mongodb.mongoose.model('users', UserSchema);

//index.js

var UserModel = require('./user');

var new_user_entity = new UserModel({});

// 调用静态方法
UserModel.findOneByName("zhangsan", function(err, doc) {
    if (err) {
        console.error(err);
    } else {
        console.log(doc);
    }
});

解释

  1. 方法类型区分:在 Mongoose 中,你可以定义两种类型的方法:

    • methods:定义在文档实例上的方法,可以操作单个文档。
    • statics:定义在模型上的方法,可以操作整个集合。
  2. 调用方式

    • 如果你想通过文档实例调用方法,使用 methods
    • 如果你想通过模型直接调用方法,使用 statics

在这个例子中,我们希望从数据库中根据名字查找用户,所以我们应该使用 statics 来定义静态方法,以便可以通过模型直接调用该方法。

这样修改后,你应该可以在 index.js 文件中成功调用 UserModel.findOneByName 方法。

回到顶部