我正在使用lean
,(这使得查询更快,内存占用更少,但结果文档是普通的旧 JavaScript 对象(POJO),)
默认情况下,这将阻止所有 getter 执行并提供 POJO(普通旧 java 对象),因此我们可以使用 mongoose-lean-getters
作为解决方案。根据 standard doc
架构:
const mongooseLeanGetters = require('mongoose-lean-getters');
const rateSchema = new Schema({
rate_photo: {
type: String,
get: getFullUrl
}
);
rateSchema.plugin(mongooseLeanGetters);
const Rate = mongoose.model('rates', rateSchema);
module.exports = Rate;
function getFullUrl(url) {
if (url != undefined) return `${process.env.ASSETS_URL}uploads/${url}`;
else return '';
}
问题:
model.Rate.find(condition).lean({ getters : true })
输出:
without getter :
"rate_photo": "rate/1574154457920-myw3schoolsimage.jpg",
With getter :
"rate_photo": "http://192.168.15.93:6600/assets/uploads/rate/1574154457920-myw3schoolsimage.jpg",
With lean:
"rate_photo": "rate/1574154457920-myw3schoolsimage.jpg",
With lean and findOne:
"rate_photo": "http://192.168.15.93:6600/assets/uploads/rate/1574154457920-myw3schoolsimage.jpg",
With lean and find: // <------------ ISSUE
expected result :
"rate_photo": "http://192.168.15.93:6600/assets/uploads/rate/1574154457920-myw3schoolsimage.jpg",
BUT GOT THIS :
"rate_photo": "http://192.168.15.93:6600/assets/uploads/http://192.168.15.93:6600/assets/uploads/rate/1574154457920-myw3schoolsimage.jpg",
<小时/>
我还发现了问题背后的原因,在npm包中,他们通过中间件调用getter两次第一次来自pre
并且来自post
的第二个,这仅适用于find
方法:
module.exports = function mongooseLeanGetters(schema) {
const fn = applyGettersMiddleware(schema);
schema.pre('find', function() { //<--------------- 1st HERE
if (typeof this.map === 'function') {
this.map((res) => {
fn.call(this, res);
return res;
});
} else {
this.options.transform = (res) => {
fn.call(this, res);
return res;
};
}
});
schema.post('find', fn); //<--------------- 2nd HERE
schema.post('findOne', fn);
schema.post('findOneAndUpdate', fn);
};
<小时/>
所以,如果我注释掉其中一个,那么效果很好,但是代码由于某种原因而存在,那么有没有更好的方法可以继续?
最佳答案
该问题已在版本中解决: 0.1.2
我认为他们已经删除了这个来解决问题:
schema.post('find', fn); //<--------------- 2nd HERE
Github 上提出的问题:https://github.com/mongoosejs/mongoose-lean-getters/issues/1
关于node.js - `mongoose-lean-getters` 无法与 `find` 正常工作,调用 getter 方法两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58973452/