簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM