Javascript ValidationError:购物车验证失败:totalPrice:转换为数值失败;“南”;在路径上“;“总价格”;

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.

我遇到了与mongoose相关的问题,我为购物车设置了模式,在模式中我将属性、数量和totalPrice设置为Number,当我测试向购物车添加第一个元素时,它显示我添加了第一个元素,但没有显示totalPrice,在我第二次添加相同的元素之后,它因ValidationError而崩溃:购物车验证失败:totalPrice:路径“totalPrice”处的值“NaN”转换为数字失败。我不知道为什么,因为我将totalPrice设置为数字类型,它应该是这样的。提前谢谢

这是models\cart.js的模式:

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.jsStoreItem模式

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}`);
})