嗨,我正在使用 mongoose 在 Node 中構建一個 RESTful API 來管理我正在構建的實踐食品配送站點上的資料。
我想設定一個補丁路由,該路由將根據用戶的請求從嵌套在我的 Orders 檔案中的 items 陣列中洗掉一個訂單項,該請求使用名稱或 ID 標識特定專案。
我有一個補丁路由,它將一個新的訂單項推送到嵌套在 Orders 檔案中的 Items Array 中,我希望這個補丁路由也能夠根據名稱或 ID 等道具從陣列中洗掉一個特定的 Item
我曾嘗試使用 Update 和 UpdateOne 方法,但我認為我只是語法錯誤或不斷出錯。
服務器.js:
require("dotenv").config()
const express = require("express");
const mongoose = require("mongoose");
const app = express();
mongoose.connect(process.env.DATABASE_URL)
const db = mongoose.connection
db.on("error", () => console.error(error))
db.once("open", () => console.log("connected to database"))
app.use(express.json())
const subscribersRouter = require("./routes/subscribers")
const suscribersLoginRouter = require ("./routes/login")
const restaurantsRouter = require("./routes/restaurants")
const ordersRouter = require("./routes/orders")
app.use("/subscribers", subscribersRouter)
app.use("/login", suscribersLoginRouter)
app.use("/restaurants", restaurantsRouter)
app.use("/orders", ordersRouter)
app.listen(3000, () => {
console.log("Server has started on port 3000")
});
訂購型號:
const mongoose = require("mongoose")
const orderSchema = new mongoose.Schema({
userID: {
type: String,
required: true
},
total: {
type: Number,
required: true
},
items: {
type: Array,
required: true
}
})
module.exports = mongoose.model("order", orderSchema)
Orders Route(你會在這里看到我有一個補丁路由,它將一個新的訂單項推送到嵌套在 Orders 檔案中的 Items Array 中,我希望這個補丁路由也能夠基于一個 prop 從陣列中洗掉一個特定的 Item例如名稱或ID,我遇到的問題是1.如何創建一個if陳述句來獲取要觸發的專案的更新以及該if陳述句中使用的代碼ID以實際更新該專案)
const express = require("express")
const router = express.Router()
const Order = require("../models/order")
// Getting All
router.get("/", async (req, res) => {
try {
const orders = await Order.find()
res.json(orders)
} catch (err) {
res.status(500).json({
message: err.message
})
}
})
// Getting One
router.get("/:id", getOrder, (req, res) => {
res.json(res.order)
})
// Creating One
router.post("/", async (req, res) => {
const order = new Order({
userID: req.body.userID,
total: req.body.total,
items: req.body.items
})
try {
console.log(order)
const newOrder = await order.save()
res.status(201).json(newOrder)
} catch (err) {
res.status(400).json({
message: err.message
})
}
})
// Updating One
router.patch("/:id", getOrder, async (req, res) => {
if (req.body.userID != null) {
res.order.userID = req.body.userID
}
if (req.body.total != null) {
res.order.total = req.body.total
}
if (req.body.items != null) {
const currentItems = res.order.items
const newItem = req.body.items
currentItems.push(newItem)
}
try {
const updatedItems = await res.order.save()
res.json(updatedItems)
} catch (err) {
res.status(400).json({
message: err.message
})
}
})
// Deleting One
router.delete("/:id", getOrder, async (req, res) => {
try {
await res.order.remove()
res.json({
message: "Deleted Order"
})
} catch (err) {
res.status(500).json({
message: err.message
})
}
})
async function getOrder(req, res, next) {
let order
try {
order = await Order.findById(req.params.id)
if (order === null) {
return res.status(404).json({
message: "Cannot Find Order"
})
}
} catch (err) {
return res.status(500).json({
message: err.message
})
}
res.order = order
next()
}
module.exports = router
測驗要求:
# ORDERS
# Get All
GET http://localhost:3000/orders
###
#Get One
GET http://localhost:3000/orders/627fe8e575a8229d0ae81e73
###
#Create One
POST http://localhost:3000/orders
Content-Type: application/json
{
"userID": "627f8b476fa64425928750c9",
"total":50,
"items": [
{
"name": "Burder",
"price": "R20",
"description": "A good Fuggen Waffel"
},
{
"name": "Hotdog",
"price": "R20",
"description": "A good Fuggen Waffel"
},
{
"name": "Bunny Chow",
"price": "R20",
"description": "A good Fuggen Waffel"
},
{
"name": "Pizza",
"price": "R20",
"description": "A good Fuggen Waffel"
}
]
}
###
#Delete One or all
DELETE http://localhost:3000/orders/628202c3b208aebc7f7f8f98
###
# Update on (add Order Item)
PATCH http://localhost:3000/orders/628202c3b208aebc7f7f8f98
Content-Type: application/json
{
"items": {
"name": "gravy",
"price": "R20",
"description": "A good Fuggen Waffel"
}
}
###
uj5u.com熱心網友回復:
我不確定我是否理解正確。我知道您需要 PATCH 路由來items按名稱從陣列中洗掉一個專案。所以這是我的解決方案:因為您已經獲取了訂單并且您只想從items屬性中洗掉特定專案,您可以filter在保存訂單檔案之前使用它來執行此操作。
res.order.items = res.order.items.filter(({ name }) => name !== itemNameToRemove);
像這樣:
// Updating One
router.patch("/:id", getOrder, async(req, res) => {
const {
userID,
total,
items,
itemNameToRemove
} = req.body;
if (userID != null) {
res.order.userID = userID;
}
if (total != null) {
res.order.total = total;
}
if (items != null) {
const newItem = items;
res.order.items.push(newItem);
if (itemNameToRemove) {
res.order.items = res.order.items.filter(({
name
}) => name !== itemNameToRemove);
}
}
try {
const updatedItems = await res.order.save()
res.json(updatedItems)
} catch (err) {
res.status(400).json({
message: err.message
})
}
})
uj5u.com熱心網友回復:
您可以為此使用 $pull。
Order.update(
{ userID : "userID123" },
{$pull : {"items" : {"name":"gravy"}}}
)
這將洗掉名稱為gravy屬于 userID 的物件:userID123
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/475994.html
標籤:javascript 节点.js mongodb 休息 猫鼬
上一篇:授權過濾測驗失敗webapi
