Node.js 值“的转换为数字失败”;“南”;(类型编号)位于计算字段Mongoose上的路径
在我的模式中,我添加了3个非必需参数Node.js 值“的转换为数字失败”;“南”;(类型编号)位于计算字段Mongoose上的路径,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,在我的模式中,我添加了3个非必需参数ratings和totalRating,用于自动计算平均值。更新现有记录时,一切正常,但单个参数记录创建失败,出现Product。创建错误:错误:产品验证失败:平均化:路径“平均化”处的值“NaN”(类型编号)转换为数字失败。 我试图在请求正文中添加ratings和totalRating,并将它们的默认值设置为0,但没有任何帮助。还是会出错。你知道为什么吗 模式: const mongoose = require('mongoose'); const pr
ratings
和totalRating
,用于自动计算平均值。更新现有记录时,一切正常,但单个参数记录创建失败,出现Product。创建错误:错误:产品验证失败:平均化:路径“平均化”
处的值“NaN”(类型编号)转换为数字失败。
我试图在请求正文中添加ratings
和totalRating
,并将它们的默认值设置为0,但没有任何帮助。还是会出错。你知道为什么吗
模式:
const mongoose = require('mongoose');
const productSchema = new mongoose.Schema({
createdOnDate: { type: Number, required: true },
name: { type: String, required: true },
brand: { type: String, required: true },
price: { type: Number, required: true },
description: { type: String, required: true },
category: { type: String, required: true },
city: { type: String, required: true },
region: { type: String, required: true },
country: { type: String, required: true },
vendor: { type: String, required: true },
barcode: { type: String, required: true },
imageUrl: { type: String, required: true },
fullImages: { type: Array, required: true },
thumbNails: { type: Array, required: true },
// productImage: Uint8Array,
minimumStock: { type: Number, required: true },
availableQuantity: { type: Number, required: true },
soldQuantity: { type: Number, required: true },
totalRating: { type: Number, required: false, default: 0 },
ratings: { type: Number, required: false, default: 0 },
averageRating: {
type: Number, required: false, default: function () {
return (this.totalRating / this.ratings)
}
},
},
{ timestamps: true });
module.exports = mongoose.model('Product', productSchema, 'Products');
已发送json:
Mongoos createProduct req.body: {
name: 'someName',
quantity: 5,
price: 5.5,
city: 'Bologna',
region: 'Emilia-Romagna',
country: 'Italy',
category: 'bikes',
vendor: 'zazza zenigata',
createdOnDate: 132468754,
availableQuantity: 5,
soldQuantity: 0,
minimumStock: 10,
imageUrl: 'someUrl',
barcode: 'someCode',
description: 'someDescription',
brand: 'someBrand',
totalRating: 0,
ratings: 0
}
错误:
Product.create error: Error: Product validation failed: averageRating: Cast to Number failed for value "NaN" (type number) at path "averageRating"
at ValidationError.inspect (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/error/validation.js:47:26)
at formatValue (node:internal/util/inspect:757:19)
at inspect (node:internal/util/inspect:336:10)
at formatWithOptionsInternal (node:internal/util/inspect:1999:40)
at formatWithOptions (node:internal/util/inspect:1881:10)
at console.value (node:internal/console/constructor:327:14)
at console.log (node:internal/console/constructor:363:61)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/api/src/controllers/product.controller.js:79:17
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4892:21
at _done (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3118:16)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3133:18
at callbackWrapper (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3087:20)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4868:18
at processTicksAndRejections (node:internal/process/task_queues:76:11) {
errors: {
averageRating: CastError: Cast to Number failed for value "NaN" (type number) at path "averageRating"
at SchemaNumber.cast (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schema/number.js:373:11)
at SchemaNumber.SchemaType.applySetters (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schematype.js:1106:12)
at SchemaNumber.SchemaType.getDefault (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schematype.js:1052:25)
at $__applyDefaults (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/document.js:437:24)
at model.Document (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/document.js:165:5)
at model.Model (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:105:12)
at new model (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4706:15)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3094:22
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3130:7
at Array.forEach (<anonymous>)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3129:15
at promiseOrCallback (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:9:12)
at Mongoose._promiseOrCallback (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/index.js:1149:10)
at Function.create (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3064:23)
at exports.createProduct (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/api/src/controllers/product.controller.js:42:11)
at handleReturn (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express-promise-router/lib/express-promise-router.js:24:23) {
stringValue: '"NaN"',
messageFormat: undefined,
kind: 'Number',
value: NaN,
path: 'averageRating',
reason: AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
assert.ok(!isNaN(val))
at castNumber (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/cast/number.js:28:10)
at SchemaNumber.cast (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schema/number.js:371:12)
at SchemaNumber.SchemaType.applySetters (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schematype.js:1106:12)
at SchemaNumber.SchemaType.getDefault (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/schematype.js:1052:25)
at $__applyDefaults (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/document.js:437:24)
at model.Document (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/document.js:165:5)
at model.Model (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:105:12)
at new model (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4706:15)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3094:22
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3130:7
at Array.forEach (<anonymous>)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3129:15
at promiseOrCallback (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:9:12)
at Mongoose._promiseOrCallback (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/index.js:1149:10)
at Function.create (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3064:23)
at exports.createProduct (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/api/src/controllers/product.controller.js:42:11) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '=='
},
valueType: 'number'
}
},
_message: 'Product validation failed'
}
Product.create: undefined
/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:19
throw error;
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:329:5)
at ServerResponse.setHeader (node:_http_outgoing:579:11)
at ServerResponse.header (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express/lib/response.js:267:15)
at ServerResponse.send (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express/lib/response.js:158:21)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/api/src/controllers/product.controller.js:85:23
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4892:21
at _done (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3118:16)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3133:18
at callbackWrapper (/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3087:20)
at /Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4868:18
at processTicksAndRejections (node:internal/process/task_queues:76:11) {
code: 'ERR_HTTP_HEADERS_SENT'
}
Product.create错误:错误:产品验证失败:平均化:路径“平均化”处的值“NaN”(类型号)转换为数字失败
在ValidationError.inspect(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/error/validation.js:47:26)
at formatValue(节点:internal/util/inspect:757:19)
检查时(节点:内部/util/inspect:336:10)
at formatWithOptionsInternal(节点:internal/util/inspect:1999:40)
at formatWithOptions(节点:internal/util/inspect:1881:10)
at console.value(节点:内部/控制台/构造函数:327:14)
在console.log(节点:internal/console/constructor:363:61)
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/api/src/controllers/product.controller.js:79:17
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:16:11
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4892:21
完成时(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/model.js:3118:16)
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3133:18
在callbackWrapper(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/model.js:3087:20)
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4868:18
在处理和拒绝时(节点:内部/处理/任务队列:76:11){
错误:{
averageRating:CastError:路径“averageRating”处的值“NaN”(类型编号)转换为数字失败
在SchemaNumber.cast(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/schema/number.js:373:11)
在SchemaNumber.SchemaType.applySetters(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/SchemaType.js:1106:12)
在SchemaNumber.SchemaType.getDefault(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/SchemaType.js:1052:25)
在$\uuuApplyDefaults(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/document.js:437:24)
位于model.Document(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/Document.js:165:5)
位于model.model(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/model.js:105:12)
在新模型中(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4706:15)
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3094:22
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3130:7
在Array.forEach()处
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3129:15
promiseOrCallback(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/helpers/promiseOrCallback.js:9:12)
在Mongoose.\u promiseOrCallback(/Volumes/ProjectsSSD/FixitServer/FixitServer\u node/node\u modules/Mongoose/lib/index.js:1149:10)
在Function.create(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3064:23)
在exports.createProduct(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/api/src/controllers/product.controller.js:42:11)
在handleReturn(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/express promise router/lib/express promise router.js:24:23){
stringValue:“‘NaN’”,
messageFormat:未定义,
种类:'编号',
价值观:楠,
路径:'平均',
原因:AssertionError[ERR_ASSERTION]:计算为错误值的表达式:
assert.ok(!isNaN(val))
在castNumber(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/cast/number.js:28:10)
在SchemaNumber.cast(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/schema/number.js:371:12)
在SchemaNumber.SchemaType.applySetters(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/SchemaType.js:1106:12)
在SchemaNumber.SchemaType.getDefault(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/SchemaType.js:1052:25)
在$\uuuApplyDefaults(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/document.js:437:24)
位于model.Document(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/Document.js:165:5)
位于model.model(/Volumes/ProjectsSSD/FixitServer/fixit\u server\u node/node\u modules/mongoose/lib/model.js:105:12)
在新模型中(/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:4706:15)
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3094:22
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3130:7
在Array.forEach()处
at/Volumes/ProjectsSSD/FixitServer/fixit_server_node/node_modules/mongoose/lib/model.js:3129:15
在允诺或回购时(/Volumes/Proj)
productSchema.virtual("numberRatings").get(function() {
return this.ratings.length;
});
productSchema.virtual("averageRating").get(function() {
return this.ratings.length > 0 ? this.totalRating / this.ratings.length : 0;
});
const productSchema = new mongoose.Schema({
createdOnDate: { type: Number, required: true },
name: { type: String, required: true },
brand: { type: String, required: true },
price: { type: Number, required: true },
description: { type: String, required: true },
category: { type: String, required: true },
city: { type: String, required: true },
region: { type: String, required: true },
country: { type: String, required: true },
vendor: { type: String, required: true },
barcode: { type: String, required: true },
imageUrl: { type: String, required: true },
fullImages: { type: Array, required: true },
thumbNails: { type: Array, required: true },
// productImage: Uint8Array,
minimumStock: { type: Number, required: true },
availableQuantity: { type: Number, required: true },
soldQuantity: { type: Number, required: true, default: 0 },
totalRating: { type: Number, required: false, default: 0 },
ratings: { type: Number, required: false, default: 0 },
// using .pre => doesn't update averageRating
averageRating: { type: Number, required: false, default: 0 },
},
{
timestamps: true
});
productSchema.pre('save', function (next) {
// this.averageRating = this.totalRating > 0 ? this.totalRating / this.ratings : 0;
this.averageRating = this.totalRating / this.ratings
next();
});
const productSchema = new mongoose.Schema({
createdOnDate: { type: Number, required: true },
name: { type: String, required: true },
brand: { type: String, required: true },
price: { type: Number, required: true },
description: { type: String, required: true },
category: { type: String, required: true },
city: { type: String, required: true },
region: { type: String, required: true },
country: { type: String, required: true },
vendor: { type: String, required: true },
barcode: { type: String, required: true },
imageUrl: { type: String, required: true },
fullImages: { type: Array, required: true },
thumbNails: { type: Array, required: true },
// productImage: Uint8Array,
minimumStock: { type: Number, required: true },
availableQuantity: { type: Number, required: true },
soldQuantity: { type: Number, required: true, default: 0 },
totalRating: { type: Number, required: false, default: 0 },
ratings: { type: Number, required: false, default: 0 },
// using .pre doesn't update
// averageRating: { type: Number, required: false, default: 0 },
},
{
timestamps: true,
toObject: { virtuals: true },
toJSON: { virtuals: true }
});
productSchema.virtual("averageRating").get(function () {
return this.totalRating > 0 ? this.totalRating / this.ratings : 0;
});