在 post 路线中模型 returns 未定义 属性 但未获取路线
Model returns undefined property in post route but not get route
在我的静态文件中:
<form action="/confirm-purchase" method="post">
<input type="text" id="name" class="form-control" required name="name">
<input type="text" id="address" class="form-control" required name="address">
<input type="submit" value="Send Order" class="btn btn-success">
</form>
点击Send Order时,代码应该获取user
对象和cart
模型等数据,并将它们放入模型order
并将它们保存到数据库中。
但是,当我点击 发送订单 时,页面上出现错误,提示无法读取 属性 'cart' 未定义并且错误来自我在 post
路由中声明变量 cart
的行。 same 变量在 get
路由中并且不知何故没有引起任何问题。
我做错了什么?
在我的路线中:
// get
router.get("/confirm-purchase", (req, res, next) => {
if (!req.session.cart) {
return res.render("shop/confirm-purchase", {products: null});
}
var cart = new Cart(req.session.cart);
res.render("shop/confirm-purchase", {totalPrice: cart.totalPrice});
});
// post
router.post("/confirm-purchase", (res, req, next) => {
var cart = new Cart(req.session.cart);
if(!req.session.cart) {
return res.redirect("/shopping-cart");
}
var order = new Order({
user: req.user, //user is object placed by passport.js
cart: cart,
name: req.body.name,
address: req.body.address
});
order.save(() => {
req.flash("success", "Successfully bought product/s!");
req.session.cart = null;
res.redirect("/");
});
});
我的购物车型号:
module.exports = function Cart(oldCart) {
this.items = oldCart.items || {};
this.totalQty = oldCart.totalQty || 0;
this.totalPrice = oldCart.totalPrice || 0;
this.add = function(item, id) {
var storedItem = this.items[id];
if (!storedItem) {
storedItem = this.items[id] = {item: item, qty: 0, price: 0};
}
storedItem.qty++;
storedItem.price = storedItem.item.price * storedItem.qty;
this.totalQty++;
this.totalPrice += storedItem.item.price;
}
this.generateArray = function() {
var arr = [];
for (var id in this.items) {
arr.push(this.items[id]);
}
return arr;
}
};
我的订单型号:
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}
});
module.exports = mongoose.model("orderSchema", schema);
我终于弄明白了:
get
和 post
路由中的 res
和 req
参数以不同的顺序写入。
我的旧代码:
// get
router.get("/confirm-purchase", (req, res, next) => {/*...*/}
// post
router.post("/confirm-purchase", (res, req, next) => {/*...*/}
应该是:
// get
router.get("/confirm-purchase", (req, res, next) => {/*...*/}
// post
router.post("/confirm-purchase", (req, res, next) => {/*...*/}
在我的静态文件中:
<form action="/confirm-purchase" method="post">
<input type="text" id="name" class="form-control" required name="name">
<input type="text" id="address" class="form-control" required name="address">
<input type="submit" value="Send Order" class="btn btn-success">
</form>
点击Send Order时,代码应该获取user
对象和cart
模型等数据,并将它们放入模型order
并将它们保存到数据库中。
但是,当我点击 发送订单 时,页面上出现错误,提示无法读取 属性 'cart' 未定义并且错误来自我在 post
路由中声明变量 cart
的行。 same 变量在 get
路由中并且不知何故没有引起任何问题。
我做错了什么?
在我的路线中:
// get
router.get("/confirm-purchase", (req, res, next) => {
if (!req.session.cart) {
return res.render("shop/confirm-purchase", {products: null});
}
var cart = new Cart(req.session.cart);
res.render("shop/confirm-purchase", {totalPrice: cart.totalPrice});
});
// post
router.post("/confirm-purchase", (res, req, next) => {
var cart = new Cart(req.session.cart);
if(!req.session.cart) {
return res.redirect("/shopping-cart");
}
var order = new Order({
user: req.user, //user is object placed by passport.js
cart: cart,
name: req.body.name,
address: req.body.address
});
order.save(() => {
req.flash("success", "Successfully bought product/s!");
req.session.cart = null;
res.redirect("/");
});
});
我的购物车型号:
module.exports = function Cart(oldCart) {
this.items = oldCart.items || {};
this.totalQty = oldCart.totalQty || 0;
this.totalPrice = oldCart.totalPrice || 0;
this.add = function(item, id) {
var storedItem = this.items[id];
if (!storedItem) {
storedItem = this.items[id] = {item: item, qty: 0, price: 0};
}
storedItem.qty++;
storedItem.price = storedItem.item.price * storedItem.qty;
this.totalQty++;
this.totalPrice += storedItem.item.price;
}
this.generateArray = function() {
var arr = [];
for (var id in this.items) {
arr.push(this.items[id]);
}
return arr;
}
};
我的订单型号:
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}
});
module.exports = mongoose.model("orderSchema", schema);
我终于弄明白了:
get
和 post
路由中的 res
和 req
参数以不同的顺序写入。
我的旧代码:
// get
router.get("/confirm-purchase", (req, res, next) => {/*...*/}
// post
router.post("/confirm-purchase", (res, req, next) => {/*...*/}
应该是:
// get
router.get("/confirm-purchase", (req, res, next) => {/*...*/}
// post
router.post("/confirm-purchase", (req, res, next) => {/*...*/}