对Mongoose模型的虚拟属性进行挖掘

有没有一种方法来存储一个Mongoose模型的虚拟属性?

假设Problem是一个模型类, difficulty是一个虚拟属性。 delete Problem.prototype.difficulty返回false,并且该属性仍然存在,所以我不能用我想要的任何值replace它。

我也试过了

 var p = new Problem(); delete p.difficulty; p.difficulty = Problem.INT_EASY; 

它没有工作。

将undefined分配给Problem.prototype.difficulty或者使用sinon.stub(Problem.prototype, 'difficulty').returns(Problem.INT_EASY); 会抛出一个exception“TypeError:无法读取未定义的属性'范围',而做

  var p = new Problem(); sinon.stub(p, 'difficulty').returns(Problem.INT_EASY); 

会抛出一个错误“TypeError:试图包装string属性困难作为function”。

我正在用尽想法。 帮帮我! 谢谢!

mongoose在内部为所有属性使用 Object.defineProperty 。 由于它们被定义为不可configuration,所以不能删除它们,也不能重新configuration它们。

但是你可以做的是覆盖模型的getset方法,这些方法用来获取和设置任何属性:

 var p = new Problem(); p.get = function (path, type) { if (path === 'difficulty') { return Problem.INT_EASY; } return Problem.prototype.get.apply(this, arguments); }; 

或者,使用sinon.js的完整示例:

 var mongoose = require('mongoose'); var sinon = require('sinon'); var problemSchema = new mongoose.Schema({}); problemSchema.virtual('difficulty').get(function () { return Problem.INT_HARD; }); var Problem = mongoose.model('Problem', problemSchema); Problem.INT_EASY = 1; Problem.INT_HARD = 2; var p = new Problem(); console.log(p.difficulty); sinon.stub(p, 'get').withArgs('difficulty').returns(Problem.INT_EASY); console.log(p.difficulty);