Javascript ValidationError:购物车验证失败:totalPrice:转换为数值失败;“南”;在路径上“;“总价格”;
我遇到了与mongoose相关的问题,我为购物车设置了模式,在模式中我将属性、数量和totalPrice设置为Number,当我测试向购物车添加第一个元素时,它显示我添加了第一个元素,但没有显示totalPrice,在我第二次添加相同的元素之后,它因ValidationError而崩溃:购物车验证失败:totalPrice:路径“totalPrice”处的值“NaN”转换为数字失败。我不知道为什么,因为我将totalPrice设置为数字类型,它应该是这样的。提前谢谢 这是models\cart.js的模式:Javascript ValidationError:购物车验证失败:totalPrice:转换为数值失败;“南”;在路径上“;“总价格”;,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我遇到了与mongoose相关的问题,我为购物车设置了模式,在模式中我将属性、数量和totalPrice设置为Number,当我测试向购物车添加第一个元素时,它显示我添加了第一个元素,但没有显示totalPrice,在我第二次添加相同的元素之后,它因ValidationError而崩溃:购物车验证失败:totalPrice:路径“totalPrice”处的值“NaN”转换为数字失败。我不知道为什么,因为我将totalPrice设置为数字类型,它应该是这样的。提前谢谢 这是models\cart.
const mongoose = require('mongoose');
const CartSchema = new mongoose.Schema(
{
items : [{
productId :{
type: mongoose.ObjectId,
ref: 'StoreItems'
},
qty: Number
}
],
totalPrice : {type:Number}
})
const Cart = mongoose.model('Cart', CartSchema);
module.exports = Cart;
C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\document.js:2626
this.$__.validationError = new ValidationError(this);
^
ValidationError: Cart validation failed: totalPrice: Cast to Number failed for value "NaN" at path "totalPrice"
at model.Document.invalidate (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\document.js:2626:32)
at model.$set (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\document.js:1290:12)
at model.set [as totalPrice] (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\helpers\document\compile.js:161:19)
at C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\routes\cart.js:54:34
at processTicksAndRejections (node:internal/process/task_queues:93:5) {
errors: {
totalPrice: CastError: Cast to Number failed for value "NaN" at path "totalPrice"
at SchemaNumber.cast (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\schema\number.js:384:11)
at SchemaNumber.SchemaType.applySetters (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\schematype.js:1075:12)
at model.$set (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\document.js:1250:20)
at model.set [as totalPrice] (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\helpers\document\compile.js:161:19)
at C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\routes\cart.js:54:34
at processTicksAndRejections (node:internal/process/task_queues:93:5) {
stringValue: '"NaN"',
messageFormat: undefined,
kind: 'Number',
value: NaN,
path: 'totalPrice',
reason: AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
assert.ok(!isNaN(val))
at castNumber (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\cast\number.js:28:10)
at SchemaNumber.cast (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\schema\number.js:382:12)
at SchemaNumber.SchemaType.applySetters (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\schematype.js:1075:12)
at model.$set (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\document.js:1250:20)
at model.set [as totalPrice] (C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\node_modules\mongoose\lib\helpers\document\compile.js:161:19)
at C:\Users\ayak3\OneDrive\Documentos\fall2020CS\Webdev\restfulapp2\routes\cart.js:54:34
at processTicksAndRejections (node:internal/process/task_queues:93:5) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: false,
expected: true,
operator: '=='
}
}
},
_message: 'Cart validation failed'
}
这是我的(models\storeitems.js)StoreItem模式:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const StoreItemsSchema = new Schema(
{
title : String,
type : String,
description : String,
price: Number,
quantity: Number
}
);
module.exports = mongoose.model('StoreItems', StoreItemsSchema);
const express = require('express');
const axios = require('axios');
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const router = express.Router();
const app = express();
app.use(express.json());
const userRoutes = require('./routes/user');
const cartRoutes = require('./routes/cart');
const storeItemsRoutes = require('./routes/storeItems');
const port = process.env.PORT || 8080;
app.use(userRoutes);
app.use(cartRoutes);
app.use(storeItemsRoutes);
const url = 'mongodb+srv://dbUser:dbUserPassword@cluster0.ij9xt.mongodb.net/Project1_SoftDev?retryWrites=true&w=majority';
const User = require("./models/user");
const StoreItems = require("./models/storeItems");
const Cart = require("./models/cart");
const storeData = require('./Data/sampleStore.json');
const dataStore = [];
//Database Name
const dbName = 'Project1_SoftDev';
let database;
//axios header config
const config = {
headers :{
'X-API-KEY' : 'a721d0c518cc4122995f8fa99ae8c2be'
}
}
const initDatabase = async ()=>{
database = await mongoose.connect(url, {userNewUrlParser: true, useUnifiedTopology:true});
if(database){
app.use(session({
secret : 'ItsAsecretWord',
store: new MongoStore({mongooseConnection:mongoose.connection})
}));
app.use(router);
console.log('Successfully connected to my DB');
}
else{
console.log('Error connecting to my DB');
}
}
//
const initializeCart = async () => {
const cart = [];
const users = await User.find({});
for (let i = 0; i < users.length; i++) {
// const newCart = {
// items: [],
// totalPrice: Number
// }
const newCart = await Cart.create({items:[],totalPrice: 0});
users[i].cart = newCart;
await users[i].save();
//cart.push(newCart);
}
//await Cart.create(cart);
}
const initializeUsers = async()=>{
const users = [];
const carts = await Cart.find({});
const firstNamePromise = await axios.get('https://randommer.io/api/Name?nameType=firstname&quantity=50',config);
const lastNamePromise = await axios.get('https://randommer.io/api/Name?nameType=surname&quantity=50', config);
const extensions = ['@hotmail.com', '@gmail.com', '@yahoo.com'];
const results = await Promise.all([firstNamePromise, lastNamePromise]);
results[0].data.forEach((name, index) => {
const assignedCart = carts[Math.floor(Math.random()*carts.length)];
users.push({firstName: name, lastName: results[1].data[index], email :
name.toLowerCase() +'.' + results[1].data[index].toLowerCase() +
extensions[Math.floor(Math.random() * extensions.length)], cart:assignedCart});
});
await User.create(users);
};
const initializeStoreItems = async() =>{
await StoreItems.create(storeData);
}
const initializeAllData = async ()=>{
await initDatabase();
//
// await User.deleteMany({}); // clean the database before populate it.
// await StoreItems.deleteMany({});
// await Cart.deleteMany({});
//
// await initializeUsers();
// await initializeStoreItems();
// await initializeCart();
// const authors = await Author.find().populate('books');
// console.log(`Author data initialized: ${authors}`);
};
initializeAllData();
app.use((req, res) => {
res.status(404).send('Element Not Found');
});
app.listen(port, ()=>{
console.log(`Ecommerce app listening at http://localhost:${port}`);
})
这是我的路线\cart.js:
const express = require('express');
const StoreItems = require('../models/storeItems');
const Cart = require('../models/cart')
const User = require('../models/user');
const router = express.Router();
router.get('/cart', async (req, res) => {
const foundCart = await Cart.find({}).populate('storeitems');
res.send(foundCart ? foundCart : 404)
})
router.get('/cart/:cartId', async (req, res) => {
const foundCart = await Cart.findById({_id : req.params.cartId}).populate('storeitems');
res.send(foundCart ? foundCart : 404)
})
router.post('/cart/:CartId/cartItem', async function (req, res){
const foundCart = await Cart.findById(req.params.CartId);
const Item = req.body;
const foundItem = await StoreItems.find({title : Item.title})
if(foundCart.items.length == 0){
const newCart = {items:[{productId: foundItem._id, qty:1}], totalPrice: foundItem.price};
foundCart.items = newCart.items;
foundCart.totalPrice = newCart.totalPrice;
}
else{
const isExisting = foundCart.items.findIndex(objItems => objItems.productId == foundItem._id);
if( isExisting == -1){
foundCart.items.push({productId: foundItem._id, qty: 1});
foundCart.totalPrice += foundItem.price;
// foundItem.quantity -=1;
}else{
const ExistingProdInCart = foundCart.items[isExisting];
ExistingProdInCart.qty += 1;
foundCart.totalPrice += foundItem.price;
}
}
foundCart.save();
res.send(foundCart ? foundCart : 404);
})
module.exports = router;
这是我的索引。js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const StoreItemsSchema = new Schema(
{
title : String,
type : String,
description : String,
price: Number,
quantity: Number
}
);
module.exports = mongoose.model('StoreItems', StoreItemsSchema);
const express = require('express');
const axios = require('axios');
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const router = express.Router();
const app = express();
app.use(express.json());
const userRoutes = require('./routes/user');
const cartRoutes = require('./routes/cart');
const storeItemsRoutes = require('./routes/storeItems');
const port = process.env.PORT || 8080;
app.use(userRoutes);
app.use(cartRoutes);
app.use(storeItemsRoutes);
const url = 'mongodb+srv://dbUser:dbUserPassword@cluster0.ij9xt.mongodb.net/Project1_SoftDev?retryWrites=true&w=majority';
const User = require("./models/user");
const StoreItems = require("./models/storeItems");
const Cart = require("./models/cart");
const storeData = require('./Data/sampleStore.json');
const dataStore = [];
//Database Name
const dbName = 'Project1_SoftDev';
let database;
//axios header config
const config = {
headers :{
'X-API-KEY' : 'a721d0c518cc4122995f8fa99ae8c2be'
}
}
const initDatabase = async ()=>{
database = await mongoose.connect(url, {userNewUrlParser: true, useUnifiedTopology:true});
if(database){
app.use(session({
secret : 'ItsAsecretWord',
store: new MongoStore({mongooseConnection:mongoose.connection})
}));
app.use(router);
console.log('Successfully connected to my DB');
}
else{
console.log('Error connecting to my DB');
}
}
//
const initializeCart = async () => {
const cart = [];
const users = await User.find({});
for (let i = 0; i < users.length; i++) {
// const newCart = {
// items: [],
// totalPrice: Number
// }
const newCart = await Cart.create({items:[],totalPrice: 0});
users[i].cart = newCart;
await users[i].save();
//cart.push(newCart);
}
//await Cart.create(cart);
}
const initializeUsers = async()=>{
const users = [];
const carts = await Cart.find({});
const firstNamePromise = await axios.get('https://randommer.io/api/Name?nameType=firstname&quantity=50',config);
const lastNamePromise = await axios.get('https://randommer.io/api/Name?nameType=surname&quantity=50', config);
const extensions = ['@hotmail.com', '@gmail.com', '@yahoo.com'];
const results = await Promise.all([firstNamePromise, lastNamePromise]);
results[0].data.forEach((name, index) => {
const assignedCart = carts[Math.floor(Math.random()*carts.length)];
users.push({firstName: name, lastName: results[1].data[index], email :
name.toLowerCase() +'.' + results[1].data[index].toLowerCase() +
extensions[Math.floor(Math.random() * extensions.length)], cart:assignedCart});
});
await User.create(users);
};
const initializeStoreItems = async() =>{
await StoreItems.create(storeData);
}
const initializeAllData = async ()=>{
await initDatabase();
//
// await User.deleteMany({}); // clean the database before populate it.
// await StoreItems.deleteMany({});
// await Cart.deleteMany({});
//
// await initializeUsers();
// await initializeStoreItems();
// await initializeCart();
// const authors = await Author.find().populate('books');
// console.log(`Author data initialized: ${authors}`);
};
initializeAllData();
app.use((req, res) => {
res.status(404).send('Element Not Found');
});
app.listen(port, ()=>{
console.log(`Ecommerce app listening at http://localhost:${port}`);
})