我正在使用MongoDB w / Mongoose ORM在Node.js / Express中构建一个基本博客。
我有一个预先'保存'钩子,我想用它为我自动生成一个博客/想法slug。这样做效果很好,除了我要查询的部分,以便在继续之前查看是否有任何其他现有帖子具有相同的slug。
但是,似乎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();
});
答案 0 :(得分:52)
不幸的是,它没有很好地记录(在Document.js API docs中没有提到它),但是文档可以通过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);
});
答案 1 :(得分:1)
在this
中你有文件,而不是模型。方法findOne不存在于文档中。
如果您需要该型号,您可以随时检索here。但更聪明的是在创建时将模型分配给变量。 然后在任何地方使用此变量。如果它在另一个文件中,那么使用module.exports并要求在项目的任何其他位置获取它。 像这样:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/dbname', function (err) {
// if we failed to connect, abort
if (err) throw err;
var IdeaSchema = Schema({
...
});
var IdeaModel = mongoose.model('Idea', IdeaSchema);
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'
IdeaModel.findOne({slug: idea.slug}, function(err, doc) {
console.log(err);
console.log(doc);
});
//console.log(idea);
next();
});
// we connected ok
})