一尘不染

如何在Node.js / Express应用程序的Mongoose预钩中进行查询?

node.js

我正在使用带有Mongoose ORM的MongoDB在Node.js / Express中构建一个基本博客。

我有一个预“保存”钩子,可以用来为我自动生成一个博客/想法。除在我要查询的部分之前,我想查询一下是否有其他现有的帖子,然后再继续操作,这一切都很好。

但是,似乎this无法访问.find或.findOne(),因此我不断收到错误消息。

解决此问题的最佳方法是什么?

  IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
      return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this has no method 'find'
    this.findOne({slug: idea.slug}, function(err, doc) {
      console.log(err);
      console.log(doc);
    });

    //console.log(idea);
    next();
  });

阅读 260

收藏
2020-07-07

共1个答案

一尘不染

不幸的是,它的文档不是很好(在Document.js
API文档中
没有提及),但是文档可以通过该constructor字段访问其模型-我一直在使用它来记录插件中的内容,这使我可以访问他们所依附的模型。

module.exports = function readonly(schema, options) {
    schema.pre('save', function(next) {
        console.log(this.constructor.modelName + " is running the pre-save hook.");

        // some other code here ...

        next();
    });
});

对于您的情况,您应该能够:

IdeaSchema.pre('save', function(next) {
    var idea = this;

    function generate_slug(text) {
        return text.toLowerCase().replace(/[^\w ]+/g,'').replace(/ +/g,'-').trim();
    };

    idea.slug = generate_slug(idea.title);

    // this now works
    this.constructor.findOne({slug: idea.slug}, function(err, doc) {
        console.log(err);
        console.log(doc);
        next(err, doc);
    });

    //console.log(idea);
});
2020-07-07