对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它们。
但是你可以做的是覆盖模型的get
和set
方法,这些方法用来获取和设置任何属性:
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);