【问题标题】:MongoDB does not save without Express server restart没有 Express 服务器重启 MongoDB 不保存
【发布时间】:2021-11-20 13:29:33
【问题描述】:

我正在 MERN 堆栈中开发一份问卷 - 每页一个问题(例如,一页上的“指定名称”,单击下一个问题,另一页上的“指定公司名称”等),大约 40 页。

当点击“下一步”时,应用程序将用户的答案保存在 localStorage 中,从 localStorage 中检索并将 axios.post 发送到 express 服务器,该服务器通过 uuid 查找 MongoDB 文档并使用新答案更新它。

问题在于并非所有答案都保存在 MongoDB 中。在一些问题之后,答案停止保存到 MongoDB。只有当我重新启动 express 服务器并再次尝试回答问题时,它才会将其保存到 MongoDB。

我不知道出了什么问题。欢迎任何建议

这是一个代码示例:

//React:
import { useState } from "react";
import axios from "axios";
import { useHistory } from "react-router-dom";
import NextQuestion from "./NextQuestion";

export default function Question1() {
  const history = useHistory();
  const [input, setInput] = useState("");

  function handleChange(e) {
    setInput(e.target.value);
  }

  function handleSubmit(e) {
    e.preventDefault();
    localStorage.setItem("name", input);

    const data = {
      uuid: localStorage.getItem("uuid"),
      name: localStorage.getItem("name"),
    };

    axios.post("/answers", data);

    history.push("/next-question");
  }

  return (
    <BrowserRouter>
      <Route path="/question-1">
        <form>
          <input id="name" type="text" value={value} onChange={handleChange} />
          <label for="#name">Please specify your name</label>
          <button onClick={handleSubmit}>NEXT QUESTION</button>
        </form>
      </Route>
      <Switch>
        <Route path="/next-question">
          <NextQuestion />
        </Route>
      </Switch>
    </BrowserRouter>
  );
}

//Express server:
require("dotenv").config();
const express = require("express");
const app = express();
const cors = require("cors");
const mongoose = require("mongoose");

app.use(express.json());
app.use(cors());

mongoose.connect(process.env.MONGO_URI);

const answerSchema = {
  uuid: String,
  name: String,
  company: String,
  title: String,
  email: String,
  phone: String,
};

const Answer = mongoose.model("Answer", answerSchema);

app.post("/answers", (req, res) => {
  if (req.body.uuid) {
    Answer.updateOne(
      { uuid: req.body.uuid },
      {
        name: req.body.name,
        company: req.body.company,
        title: req.body.title,
        email: req.body.email,
        phone: req.body.phone,
      },
      {
        upsert: true,
      }
    )
      .then((item) => console.log(item))
      .catch((err) => res.status(400).json("Error " + err));
  } else {
    const newAnswer = new Answer({
      uuid: req.body.uuid,
      name: req.body.name,
      company: req.body.company,
      title: req.body.title,
      email: req.body.email,
      phone: req.body.phone,
    });

    newAnswer
      .save()
      .then((item) => console.log(item))
      .catch((err) => res.status(400).json("Error " + err));
  }
});

app.listen(3001, function () {
  console.log("Express is running");
});

【问题讨论】:

  • 具体发生在什么时候?随机跳过答案或总是相同的答案?你有什么错误吗?你如何将 uuid 分配给用户?
  • @kmp,嗨,经过多次测试,我注意到它保存了问题 1-4,然后从问题 5 停止保存.. 然后我重新启动快速服务器并将问题 5 保存到大约。 9..我可以说在第 5 个问题之后它是非常随机的。直到问题 5 一切正常。我没有收到任何错误。 uuid 在 App.js 中通过 useEffect(() => { const id = uuidv4(); localStorage.setItem("uuid", id); }, []);
  • 试试这个:stackoverflow.com/a/24711713/13747848 并删除 if-else 语句,因为您使用的是{ upsert: true },这意味着如果它不存在,它将创建一个新对象。
  • 直觉猜测:与其保持从 Express 到 Mongo 的单个连接,不如尝试为每次保存单独连接,每次保存后断开连接。
  • @kmp,成功了!我删除了 if/else 语句并使用了 findOneAndUpdate 方法☺️请将您的解决方案作为答案发布,以便我接受它

标签: javascript node.js mongodb express mern


【解决方案1】:

原答案:How do I update/upsert a document in Mongoose?

请务必注明原答辩人


Mongoose 现在通过 findOneAndUpdate 原生支持此功能(调用 MongoDB findAndModify)。

{ upsert: true } 选项会在对象不存在时创建它。 默认为 false

var query = {'username': req.user.username};
req.newData.username = req.user.username;

MyModel.findOneAndUpdate(query, req.newData, {upsert: true}, function(err, doc) {
    if (err) return res.send(500, {error: err});
    return res.send('Succesfully saved.');
});

在旧版本中,Mongoose 不支持使用此方法的这些钩子:

  • 默认值
  • 二传手
  • 验证器
  • 中间件

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 2023-04-08
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    相关资源
    最近更新 更多