MongoDB 不重启 Express 服务器不保存
MongoDB does not save without Express server restart
我正在 MERN 堆栈中开发问卷 - 每页一个问题(例如,一页上的“指定名称”,单击下一个问题,另一页上的“指定公司名称”等),大约 40 页。
当点击“下一步”时,应用程序将用户的答案保存在 localStorage 中,从 localStorage 中检索并发送一个 axios.post 到 express 服务器,它通过 uuid 找到一个 MongoDB 文档并用一个更新它新答案。
问题是并非所有答案都保存在 MongoDB 中。在一些问题之后,答案停止保存到 MongoDB。只有当我重新启动快递服务器并再次尝试回答问题时,它才会将其保存到 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");
});
原回答:How do I update/upsert a document in Mongoose?
请务必注明原回答者
Mongoose 现在通过 findOneAndUpdate (calls 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 不支持使用此方法的这些挂钩:
- 默认值
- 二传手
- 验证者
- 中间件
我正在 MERN 堆栈中开发问卷 - 每页一个问题(例如,一页上的“指定名称”,单击下一个问题,另一页上的“指定公司名称”等),大约 40 页。
当点击“下一步”时,应用程序将用户的答案保存在 localStorage 中,从 localStorage 中检索并发送一个 axios.post 到 express 服务器,它通过 uuid 找到一个 MongoDB 文档并用一个更新它新答案。
问题是并非所有答案都保存在 MongoDB 中。在一些问题之后,答案停止保存到 MongoDB。只有当我重新启动快递服务器并再次尝试回答问题时,它才会将其保存到 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");
});
原回答:How do I update/upsert a document in Mongoose?
请务必注明原回答者
Mongoose 现在通过 findOneAndUpdate (calls 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 不支持使用此方法的这些挂钩:
- 默认值
- 二传手
- 验证者
- 中间件