node.js - `mongoose-lean-getters` 无法与 `find` 正常工作,调用 getter 方法两次

标签 node.js mongoose

我正在使用lean(这使得查询更快,内存占用更少,但结果文档是普通的旧 JavaScript 对象(PO​​JO),)

默认情况下,这将阻止所有 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/

相关文章:

node.js - 如何使用两个LocalStrategy?

node.js - 使用混合数组 [{ }] 时的 Mongoose 架构验证问题

mongodb - 正则表达式作为投影中的 $filter

node.js - 为什么我的 Mongoose 模型即使在传递集合名称后仍返回空白响应?

node.js - $map mongodb中带有索引的$concat字段?

node.js - 如何直接在 Angular 4/expressJS 服务器中运行项目(无需 webpack)

javascript - Grunt 安装在 Ubuntu 上但无法正常工作

javascript - Ryan Dahl 的 Node 聊天

node.js - 验证在带有 Mongo 的 Node 中的 Mongoose 中不起作用

node.js - Mongoose 搜索产生神秘错误