我正在使用MongoDB在node.js中开发一个应用程序 我要文件: product.js和displaycost.js
这是产品.js:
var mongoose = require('mongoose');
var Category = require('./category');
var productSchema = {
name:{type: String, require: true},
//Pictures mus start with "http://"
pictures:[{type:String, match: /^http:\/\//i}],
price:{
amount:{type: Number, required: true},
//ONly 3 supported currencies for now
currency:{
type: String,
enum:['USD','EUR','GBP'],
required: true
}
},
category: Category.categorySchema
};
var schema = new mongoose.Schema(productSchema);
var currencySymbols ={
'USD': '$',
'EUR':'€',
'GBP':'£'
};
/*
*
*/
schema.virtual('displayPrice').get(function(){
return currencySymbols[this.price.currency] +
'' + this.price.amount;
});
schema.set('toObject', {virtuals:true});
schema.set('toJSON', {virtuals:true});
module.exports = schema;
我需要的是使用" productSchema"创建记录。 我试过这个:
var Product = require('./product.js');
var p = new Product({
name: 'test',
price:{
amount : 5,
currency: 'USD'
},
category: {
name: 'test'
}
});
console.log(p.displayPrice); // "$5"
p.price.amount = 20;
console.log(p.displayPrice); //" $20"
//{... "displayPrice: "$20",...}
console.log(JSON.stringify(p));
var obj = p.toObject();
但是当我运行displaycost.js时,我会在“" new" 并写入" TypeError:object不是函数"
我不知道为什么会这样。谢谢。
答案 0 :(得分:0)
“new”只能在函数上调用。不是一个对象。
在program.js中,您正在创建一个mongoose模式的新实例。
var schema = new mongoose.Schema(productSchema);
... more code ...
return schema;
在您的其他js文件中,您需要产品。此时,product.js已经向您返回了一个对象。一个新的mongoose架构。这是一个你称之为产品的对象。
然后,您尝试通过在产品OBJECT上调用new来创建它的新实例。无法在对象文字上调用New。它只能在函数上调用。
我不相信你需要在product.js中创建一个新的模式实例,只需返回创建模式的函数。然后在需要时调用new,就像你在第二个文件中一样。
答案 1 :(得分:0)
您缺少带有型号名称的导出猫鼬模型。
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
Category = require('./category');
var productSchema = new Schema({
name: {type: String, require: true},
pictures: [{type: String, match: /^http:\/\//i}],
price: {
amount: {type: Number, required: true},
currency: {
type: String,
enum: ['USD', 'EUR', 'GBP'],
required: true
}
},
category: Category
});
var currencySymbols = {
'USD': '$',
'EUR': '€',
'GBP': '£'
};
productSchema.virtual('displayPrice').get(function () {
return currencySymbols[this.price.currency] +
'' + this.price.amount;
});
productSchema.set('toObject', {virtuals: true});
productSchema.set('toJSON', {virtuals: true});
module.exports = mongoose.model('Product', productSchema);