简体   繁体   English

猫鼬不保存数据到mongodb吗?

[英]Mongoose not saving data to mongodb?

I'm building a shopping cart using JavaScript, MongoDB & Node.js. 我正在使用JavaScript,MongoDB和Node.js构建购物车。 I've been able to save all the site's products, users & sessions so far. 到目前为止,我已经可以保存该网站的所有产品,用户和会话。 After I complete my checkout form, my inputs should be saved to MongoDB. 完成结帐表格后,我的输入应保存到MongoDB。 I should be able to see "orders" among the db collections. 我应该能够看到db集合中的“订单”。 But when I type show collections into the command line, only products, users, sessions are shown. 但是,当我在命令行中输入show collections时,仅显示产品,用户和会话

This is the error message: 这是错误消息:

ValidationError: Order validation failed
    at MongooseError.ValidationError (/Users/vynguyen/shopping-cart/node_modules/mongoose/lib/error/validation.js:23:11)
    at model.Document.invalidate (/Users/vynguyen/shopping-cart/node_modules/mongoose/lib/document.js:1524:32)
    at /Users/vynguyen/shopping-cart/node_modules/mongoose/lib/document.js:1399:17
    at validate (/Users/vynguyen/shopping-cart/node_modules/mongoose/lib/schematype.js:706:7)
    at /Users/vynguyen/shopping-cart/node_modules/mongoose/lib/schematype.js:750:9
    at Array.forEach (native)
    at SchemaString.SchemaType.doValidate (/Users/vynguyen/shopping-cart/node_modules/mongoose/lib/schematype.js:711:19)
    at /Users/vynguyen/shopping-cart/node_modules/mongoose/lib/document.js:1397:9
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

This is my Mongoose schema: 这是我的猫鼬模式:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var schema = new Schema({
    user: {type: Schema.Types.ObjectId, ref: 'User'},
    cart: {type: Object, required: true},
    address: {type: String, required: true},
    name: {type: String, required: true},
    paymentId: {type: String, required: true}
});

module.exports = mongoose.model('Order', schema);

This is my index.js: 这是我的index.js:

var express = require('express');
var router = express.Router();
var Cart = require('../models/cart');

var Product = require('../models/product');
var Order = require('../models/order');

/* GET home page. */
router.get('/', function(req, res, next) {
    var successMsg = req.flash('success')[0];
    Product.find(function(err, docs) {
        var productChunks = [];
        var chunkSize = 3;
        for (var i = 0; i < docs.length; i += chunkSize) {
            productChunks.push(docs.slice(i, i + chunkSize));
        }
        res.render('shop/index', { title: 'Shopping Cart', products: productChunks, successMsg: successMsg, noMessages: !successMsg});
    });
});

router.get('/add-to-cart/:id', function(req, res, next) {
    var productId = req.params.id;
    var cart = new Cart(req.session.cart ? req.session.cart : {});

    Product.findById(productId, function(err, product){
        if (err) {
            return res.redirect('/');
        }
        cart.add(product, product.id);
        req.session.cart = cart;
        res.redirect('/');
    });
});

router.get('/shopping-cart', function(req, res, next) {
    if (!req.session.cart) {
        return res.render('shop/shopping-cart', {products: null});
    }
    var cart = new Cart(req.session.cart);
    res.render('shop/shopping-cart', {products: cart.generateArray(), totalPrice: cart.totalPrice});
});

router.get('/checkout', function(req, res, next) {
    if (!req.session.cart) {
        return res.redirect('/shopping-cart');
    }
    var cart = new Cart(req.session.cart);
    var errMsg = req.flash('error')[0];
    res.render('shop/checkout', {total: cart.totalPrice, errMsg: errMsg, noError: !errMsg});
});

router.post('/checkout', function(req, res, next) {
    if (!req.session.cart) {
        return res.redirect('/shopping-cart');
    }
    var cart = new Cart(req.session.cart);

    var stripe = require("stripe")(
      "**hidden**"
    );

    stripe.charges.create({
      amount: cart.totalPrice * 100,
      currency: "usd",
      source: req.body.stripeToken,
      description: "Test Charge"
    }, function(err, charge) {
        if (err) {
            req.flash('error', err.message);
            return res.redirect('/checkout');
        }
        var order = new Order({
            user: req.user,
            cart: cart,
            address: req.body.address,
            name: req.body.name,
            paymentId: charge.id
        });
        order.save(function(err, result) {
            req.flash('success', 'Successfully bought product!');
            req.session.cart = null;
            res.redirect('/');  
        });
    });
});

module.exports = router;

So, this is how I solved the error: 因此,这就是我解决错误的方法:

I consoled out every field inside the order object and found a syntax error in my checkout.form that is linked to req.body.address. 我安慰了订单对象中的每个字段,并在我的checkout.form中发现了语法错误,该错误链接到req.body.address。 After fixing the error 'order' is now showing in my db collections. 修复错误后,“ order”现在显示在我的数据库集合中。

Phew! 唷! Kudos to israel.zinc for spending time chatting with me to get to the bottom of the issue. 感谢israel.zinc花时间与我聊天以深入探讨问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM