[英]How to get nested properties to be saved in a new document in a new collection in MongoDB?
[英]MongoDB: when deleting an old collection and inserting a new collection, sometimes the new collection is not saved
有一個帶有輸入文本字段的表單,用於定義口味列表。 提交表單應該刪除舊的風味集合並用新的風味集合替換它。
口味集合示例:[{name: vanilla}, {name: chocolate}]。
數據庫為MongoDB,服務端使用Node.JS + Express + Mongoose,客戶端使用React。
有時程序運行正常,但有時多次提交表單后,舊的collection被刪除,新的collection沒有保存,沒有任何錯誤出現,有時會出現id is duplicated key的錯誤。
在我在 stackoverflow 上找到的一些答案中,我讀到它應該被定義為“{ ordered: false }”。 我試過了,如所附代碼所示,但這也沒有解決問題。
服務器端:
flavorsModel.js
import "dotenv/config.js";
import { Schema, model } from "mongoose";
const flavorsSchema = new Schema({
name: {
type: String,
require: true,
},
});
export default model("", flavorsSchema, process.env.MONGODB_COLLECTION_NAME);
flavorsController.js
import flavorsModel from "../models/flavorsModel.js";
export async function loadFlavors(_, res) {
const flavors = await flavorsModel.find().catch((err) => console.log(err));
res.send(flavors);
console.log("flavors loaded", flavors);
}
export async function deleteFlavors() {
await flavorsModel.deleteMany().catch((err) => console.log(err));
console.log("flavors deleted");
}
export async function saveFlavors(req, _) {
const flavors = await flavorsModel
.insertMany(req.body, { ordered: false })
.catch((err) => console.log(err));
console.log("flavors saved", flavors);
}
flavorsRoute.js
import { Router } from "express";
import { loadFlavors, deleteFlavors, saveFlavors} from "../controllers/flavorsController.js";
const router = Router();
router.get("/loadFlavors", loadFlavors);
router.delete("/deleteFlavors", deleteFlavors);
router.post("/saveFlavors", saveFlavors);
export default router;
服務器.js
import cors from "cors";
import "dotenv/config.js";
import express from "express";
import mongoose from "mongoose";
import flavorsRoute from "./routes/flavorsRoute.js";
const app = express();
const port = process.env.port || 5000;
mongoose
.connect(process.env.MONGODB_URL)
.then(() => console.log("MongoDB connected"))
.catch((err) => console.log(err));
app.use(cors());
app.use("/flavors", flavorsRoute);
app.listen(port, () => {
console.log(`Server on port http://localhost:${port}`);
});
客戶端:
import axios from "axios";
const baseUrl = "http://localhost:5000/flavors";
const loadFlavors = (setFlavors) => {
axios.get(`${baseUrl}/loadFlavors`).then(({ data }) => {
console.log("data", data);
setFlavors(data);
});
};
const saveFlavors = (flavors) => {
axios
.all([
axios.delete(`${baseUrl}/deleteFlavors`, {}),
axios.post(`${baseUrl}/saveFlavors`, flavors),
])
.catch((err) => console.log(err));
};
export { loadFlavors, saveFlavors };
通過使用axios.all()
您可以並行運行刪除請求和保存請求。 運氣好的話,刪除后會發生保存,就萬事大吉了。 如果您不走運,保存將在刪除之前或刪除期間發生,並導致您描述的行為。
要按順序運行它們會是這樣的:
const saveFlavors = async (flavors) => {
await axios.delete(`${baseUrl}/deleteFlavors`, {}).catch((err) => console.log(err));
await axios.post(`${baseUrl}/saveFlavors`, flavors).catch((err) => console.log(err));
};
您還需要更新后端以從這些路由發送響應,否則前端將在等待未到來的響應時掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.