如何在 mongoose Schema 中创建数组以及如何通过 json 向其发送数据
How to create an array in mongoose Schema and how to send data to it through json
我正在创建一个电子商务项目,但在创建订单模式时遇到了两难。根据我的说法,我确信客户有时不能订购一件商品,因此订单应该排成一列,但由于我是初学者,所以我在浏览时遇到了麻烦。这是我在我的模型和控制器中想出的,但是每当我 post 数据时,我收到的 res.json 带有一个空对象。
我希望有人能帮助解决这个问题。
我的订单模型
import mongoose from 'mongoose'
const ordersSchema = new mongoose.Schema({
user:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:"users",
},
orders:[
{
item:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:'products'
},
quatity:{
type:Number,
required:true,
default:1
},
price:{
type:Number,
required:true,
}
}
]
});
export const ordersModel = mongoose.model("orders", ordersSchema);
我创建订单的控制器代码
import { ordersModel} from "../models/orders.model.js"
import asyncHandler from 'express-async-handler'
export const makeOrder =asyncHandler(async(req, res) => {
const {item, price, quantity, payment} = req.body;
if(!item || !price ){
res.sendStatus(401)
res.json({message: 'There is no order to make'});
}else{
const order = new ordersModel(
{
user:req.user._id,
order:[
{
item,
price,
quantity,
payment
}
],
}
);
const made_order = await (order.save());
if(made_order){
return res.json({
orderId:made_order._id,
customer:made_order.user._id,
order:{
item:made_order.item,
price:made_order.price,
quantity:made_order.quantity,
payment:made_order.payment,
}
})
}
}
});
我在创建新订单时发现有错字。您在架构中有 orders
字段,但在创建新订单时传递的是 order
而末尾没有 s
。下面是正确的实现
const order = new ordersModel(
{
user: req.user._id,
orders: [
{
item,
price,
quantity,
payment
}
],
}
);
您在架构中也没有 payment
字段,但您在创建订单时传递了它。所以如果你想包含付款字段,你的架构应该是这样的
const ordersSchema = new mongoose.Schema({
user:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:"users",
},
orders:[
{
item:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:'products'
},
quatity:{
type:Number,
required:true,
default:1
},
price:{
type:Number,
required:true,
},
payment:{
type:Number,
required:true,
}
}
]
});
最后你可以去掉if语句,像这样发送一个res
const made_order = await order.save();
return res.json({
orderId:made_order._id,
customer:made_order.user,
orders: made_order.orders
})
如果您想在一次调用中创建多个订单,您的 makeOrder
控制器应该像这样
export const makeOrder = asyncHandler(async(req, res) => {
if(!Array.isArray(req.body) || !req.body.length) {
res.sendStatus(401)
res.json({message: 'There is no order to make'});
} else {
const order = new ordersModel(
{
user: req.user._id,
orders: req.body,
}
);
const made_order = await order.save();
return res.json({
orderId: made_order._id,
customer: made_order.user,
orders: made_order.orders
})
}
});
然后您可以拨打 API 电话并发送多个订单作为请求正文
[
{
"item":"61f58bb0d70ae52c6e470fb7",
"price":4500,
"quantity":2,
"payment": 9000
},
{
"item":"61f58bb0d70ae52c6e470fb7",
"price":4500,
"quantity":2,
"payment": 9000
}
]
我正在创建一个电子商务项目,但在创建订单模式时遇到了两难。根据我的说法,我确信客户有时不能订购一件商品,因此订单应该排成一列,但由于我是初学者,所以我在浏览时遇到了麻烦。这是我在我的模型和控制器中想出的,但是每当我 post 数据时,我收到的 res.json 带有一个空对象。
我希望有人能帮助解决这个问题。
我的订单模型
import mongoose from 'mongoose'
const ordersSchema = new mongoose.Schema({
user:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:"users",
},
orders:[
{
item:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:'products'
},
quatity:{
type:Number,
required:true,
default:1
},
price:{
type:Number,
required:true,
}
}
]
});
export const ordersModel = mongoose.model("orders", ordersSchema);
我创建订单的控制器代码
import { ordersModel} from "../models/orders.model.js"
import asyncHandler from 'express-async-handler'
export const makeOrder =asyncHandler(async(req, res) => {
const {item, price, quantity, payment} = req.body;
if(!item || !price ){
res.sendStatus(401)
res.json({message: 'There is no order to make'});
}else{
const order = new ordersModel(
{
user:req.user._id,
order:[
{
item,
price,
quantity,
payment
}
],
}
);
const made_order = await (order.save());
if(made_order){
return res.json({
orderId:made_order._id,
customer:made_order.user._id,
order:{
item:made_order.item,
price:made_order.price,
quantity:made_order.quantity,
payment:made_order.payment,
}
})
}
}
});
我在创建新订单时发现有错字。您在架构中有 orders
字段,但在创建新订单时传递的是 order
而末尾没有 s
。下面是正确的实现
const order = new ordersModel(
{
user: req.user._id,
orders: [
{
item,
price,
quantity,
payment
}
],
}
);
您在架构中也没有 payment
字段,但您在创建订单时传递了它。所以如果你想包含付款字段,你的架构应该是这样的
const ordersSchema = new mongoose.Schema({
user:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:"users",
},
orders:[
{
item:{
type:mongoose.Schema.Types.ObjectId,
required:true,
ref:'products'
},
quatity:{
type:Number,
required:true,
default:1
},
price:{
type:Number,
required:true,
},
payment:{
type:Number,
required:true,
}
}
]
});
最后你可以去掉if语句,像这样发送一个res
const made_order = await order.save();
return res.json({
orderId:made_order._id,
customer:made_order.user,
orders: made_order.orders
})
如果您想在一次调用中创建多个订单,您的 makeOrder
控制器应该像这样
export const makeOrder = asyncHandler(async(req, res) => {
if(!Array.isArray(req.body) || !req.body.length) {
res.sendStatus(401)
res.json({message: 'There is no order to make'});
} else {
const order = new ordersModel(
{
user: req.user._id,
orders: req.body,
}
);
const made_order = await order.save();
return res.json({
orderId: made_order._id,
customer: made_order.user,
orders: made_order.orders
})
}
});
然后您可以拨打 API 电话并发送多个订单作为请求正文
[
{
"item":"61f58bb0d70ae52c6e470fb7",
"price":4500,
"quantity":2,
"payment": 9000
},
{
"item":"61f58bb0d70ae52c6e470fb7",
"price":4500,
"quantity":2,
"payment": 9000
}
]