mongoose calling .find inside a pre('save ')hook

ezykj2lf  于 2023-04-06  发布在  Go
关注(0)|答案(2)|浏览(122)

目前,我正在尝试以下操作:

const ItemSchema = mongoose.Schema({
 ...
 name : String
 ...
});

ItemSchema.pre('save', async function() {
  try{
     let count = await ItemSchema.find({name : item.name}).count().exec();
     ....
     return Promise.resolve();
  }catch(err){
     return Promise.reject(err)
  }
});

module.exports = mongoose.model('Item', ItemSchema);

但我只是得到以下错误:
TypeError:ItemSchema.find不是函数
如何在post('save ')中间件中调用.find()方法?(我知道Schmemas上有一个唯一的属性。如果名称字符串已经存在,我必须这样做才能给它添加后缀)
Mongoose 版本:5.1.3 nodejs版本:8.1.1系统:Ubuntu 16.04

vqlkdk9b

vqlkdk9b1#

find静态方法在模型上可用,而ItemSchema是模式。
它应该是:

ItemSchema.pre('save', async function() {
  try{
     let count = await Item.find({name : item.name}).count().exec();
     ....
  }catch(err){
     throw err;
  }
});

const Item = mongoose.model('Item', ItemSchema);
module.exports = Item;

或者:

ItemSchema.pre('save', async function() {
  try{
     const Item = this.constructor;
     let count = await Item.find({name : item.name}).count().exec();
     ....
  }catch(err){
         throw err;
  }
});

module.exports = mongoose.model('Item', ItemSchema);

注意,Promise.resolve()async函数中是冗余的,它已经在成功的情况下返回resolved promise,Promise.reject也是如此。

xiozqbni

xiozqbni2#

我们可以先声明模型名称,然后用它通过名称获取模型示例,然后我们就可以使用model.ex的静态函数:find、findOne ...等

const modelName = 'Item'; // <---- Hint
const ItemSchema = mongoose.Schema({
 ...
 name : String
 ...
});

ItemSchema.pre(
  'save',
  { ducument: true },
  async function() {
    try {
      let count = await this.model(modelName) // <-- Hint
                            .find({name : item.name})
                            .count()
                            .exec();
      
    } catch(err){
        throw err;
    }
  }
);

module.exports = mongoose.model(modelName, ItemSchema);

相关问题