虚拟在Mongoose对象是未定义的?

我最近一直在学习MongoDB和Mongoose以学习MEAN栈。 使用这个课程: https : //www.edx.org/course/introduction-mongodb-using-mean-stack-mongodbx-m101x我试图为我的产品架构创build一个虚拟,显示价格更方便用户办法。 但是,打印出这个虚拟displayPrice它会出现未定义,除非通过toObjecttoJSON访问,即使这样USD符号显示为一个问号。 我为任何愚蠢和明显的忽视道歉,我是这个数据库的新东西,无法find许多简单的解释事情的教程。

这里是代码:

 var mongoose = require("mongoose"); var Category = require("./categoryschema.js"); var productSchema = { name: { type: String, required: true }, // Pictures must start with http://" pictures: [{ type: String, match: /^http:\/\//i }], price: { amount: { type: Number, required: true }, currency: { type: String, enum: ["USD", "EUR", "GBP"], required: true } }, category: Category.categorySchema }; module.exports = new mongoose.Schema(productSchema); module.exports.productSchema = productSchema; var schema = new mongoose.Schema(productSchema); var Product = mongoose.model("Product", schema); var currencySymbols = { "USD": "$", "EUR": "E", "GBP": "P" }; // Make human readable string form of price. "$25" instead of "25 USD" schema.virtual("displayPrice").get(function() { return currencySymbols[this.price.currency] + "" + this.price.amount; }); schema.set("toObject", { virtuals: true }); schema.set("toJSON", { virtuals: true }); var p = new Product({ name: "test product", price: { amount: "33.58", currency: "USD" } }); console.log(p.displayPrice); p.price.amount = 20; console.log(p.displayPrice); p.price.currency = "EUR"; console.log(JSON.stringify(p)); var obj = p.toObject(); console.log(obj.displayPrice); 

输出:

 undefined undefined {"name":"test product","_id":"569c39774093336c149eba2c","category":{"ancestors": []},"price":{"amount":20,"currency":"EUR"},"pictures":[],"displayPrice":"E20","i d":"569c39774093336c149eba2c"} E20 

似乎工作的唯一的东西是分配虚拟的价格键。 我不知道为什么这是解决scheme,所以任何答案将不胜感激。 它似乎只是直接logging虚拟的价值。

新产品方框:

 var mongoose = require("mongoose"); var Category = require("./categoryschema.js"); var fx = require("./fx.js"); var productSchema = { name: { type: String, required: true }, // Pictures must start with http://" pictures: [{ type: String, match: /^http:\/\//i }], price: { amount: { type: String, required: true, set: function(v) { this.internal.approximatePriceUSD = v / (fx()[this.price.currency] || 1); return v; } }, currency: { type: String, enum: ["USD", "EUR", "GBP"], required: true, set: function(v) { this.internal.approximatePriceUSD = this.price.amount / (fx()[v] || 1); return v; } } }, category: Category.categorySchema, internal: { approximatePriceUSD: Number } }; var schema = new mongoose.Schema(productSchema); var Product = mongoose.model("Product", schema); var currencySymbols = { "USD": "$", "EUR": "E", "GBP": "P" }; // Make human readable string form of price. "$25" instead of "25 USD" schema.virtual("price.displayPrice").get(function() { return currencySymbols[this.price.currency] + "" + this.internal.approximatePriceUSD; }); schema.set("toObject", { virtuals: true }); schema.set("toJSON", { virtuals: true }); var p = new Product({ name: "test product", price: { amount: "12.50", currency: "USD" }, category: { name: "test" } }); console.log(p.price.displayPrice); console.log(p.price.currency + ": " + p.internal.approximatePriceUSD); p.price.currency = "EUR"; console.log(p.price.displayPrice); console.log(p.price.currency + ": " + p.internal.approximatePriceUSD); p.price.currency = "GBP"; console.log(p.price.displayPrice); console.log(p.price.currency + ": " + p.internal.approximatePriceUSD); module.exports = new mongoose.Schema(productSchema); module.exports.productSchema = productSchema; 

新产出:

 $12.5 USD: 12.5 E11.363636363636363 EUR: 11.363636363636363 P8.333333333333334 GBP: 8.333333333333334