NodeJs & Express Learning RESTFUL,当提交表单进行更新时,它会创建一个带有新 ._id 的新表单,而不是更新原始表单
NodeJs & Express Learning RESTFUL, when submitting form to update, it creates a new form with a new ._id instead of updating the original one
我正在学习如何使用快速服务器和 RESTFUL 路由。目前我无法更新我的博客 post,当我在我的编辑页面上点击提交时它会将我带到未编辑的原始 post 但是当我转到索引页面时原始 post 没有变化,并且有一个重复的 post,其中包含我使用新的 ._id 所做的编辑。我 运行 这是在本地环境中。数据库 Mongodb 使用 Mongoose。
//app.js file
const express = require('express'),
app = express(),
bodyParser = require('body-parser'),
mongoose = require('mongoose'),
port = 3000;
const methodOverride = require('method-override');
////APP CONFIG
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(methodOverride("_method"));
mongoose.connect('mongodb://localhost:27017/restful_blog', {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
});
////MONGOOSE/MODEL/CONFIG
const blogSchema = new mongoose.Schema({
title: String,
image: String,
body: String,
created: {
type: Date,
default: Date.now
}
});
const Blog = mongoose.model('Blog', blogSchema);
////RESTFUL ROUTES
app.get('/', (req, res) => {
res.redirect('/blogs');
});
//Index Route
app.get('/blogs', (req, res) => {
Blog.find({}, (err, blogs) => {
if (err) {
console.log(err);
} else {
res.render('index', {
blogs: blogs
});
}
});
});
//New Route
app.get('/blogs/new', (req, res) => {
res.render('new');
});
//Create Route
app.post('/blogs', (req, res) => {
//Create Blog
Blog.create(req.body.blog, (err, newBlog) => {
if (err) {
res.render('new');
} else {
//Then, Redirect to Index
res.redirect('/blogs');
}
});
});
//Show Route
app.get('/blogs/:id', (req, res) => {
Blog.findById(req.params.id, (err, foundBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.render('show', {
blog: foundBlog
});
}
});
});
//Edit Route
app.get('/blogs/:id/edit', (req, res) => {
Blog.findById(req.params.id, (err, foundBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.render('edit', {
blog: foundBlog
});
}
});
});
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findOneAndUpdate(req.body.id, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
////Starts Server
app.listen(port, () => console.log(
`YelpCamp is running at http://localhost:${port}`
));
//edit.js file
<%- include('partials/header') %>
<div class="ui main text container segment">
<div class="ui huge header">
Edit <%= blog.title %>
</div>
<form class='ui form' method="POST" action="/blogs/<%= blog._id %>?_method=PUT" >
<div class="field">
<label>Title</label>
<input class="ui input" type="text" name="blog[title]" value="<%= blog.title %>">
</div>
<div class="field">
<label>Image</label>
<input class="ui input" type="text" name="blog[image]" value='<%= blog.image %>'>
</div><div class="field">
<label>Blog Post</label>
<textarea name="blog[body]"><%= blog.body %></textarea>
</div>
<input class='ui basic button red big' type="submit">
</form>
</div>
<%- include('partials/footer') %>
我认为问题出在更新路径上,您正在使用 findOneAndUpdate
并只将 id
传递给它,而您应该将 object
作为过滤器传递给它
此外,id
在 params
对象中而不在正文中,因此我们必须使用 req.params.id
而不是 req.body.id
所以我猜你有两种选择来解决这个问题
1- 使用 findOneAndUpdate
,但传递一个对象作为过滤器
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findOneAndUpdate({ _id: req.params.id }, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
2-或者使用findByIdAndUpdate
,这里可以直接传id
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findByIdAndUpdate(req.params.id, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
希望对您有所帮助
我正在学习如何使用快速服务器和 RESTFUL 路由。目前我无法更新我的博客 post,当我在我的编辑页面上点击提交时它会将我带到未编辑的原始 post 但是当我转到索引页面时原始 post 没有变化,并且有一个重复的 post,其中包含我使用新的 ._id 所做的编辑。我 运行 这是在本地环境中。数据库 Mongodb 使用 Mongoose。
//app.js file
const express = require('express'),
app = express(),
bodyParser = require('body-parser'),
mongoose = require('mongoose'),
port = 3000;
const methodOverride = require('method-override');
////APP CONFIG
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(methodOverride("_method"));
mongoose.connect('mongodb://localhost:27017/restful_blog', {
useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true,
useFindAndModify: false
});
////MONGOOSE/MODEL/CONFIG
const blogSchema = new mongoose.Schema({
title: String,
image: String,
body: String,
created: {
type: Date,
default: Date.now
}
});
const Blog = mongoose.model('Blog', blogSchema);
////RESTFUL ROUTES
app.get('/', (req, res) => {
res.redirect('/blogs');
});
//Index Route
app.get('/blogs', (req, res) => {
Blog.find({}, (err, blogs) => {
if (err) {
console.log(err);
} else {
res.render('index', {
blogs: blogs
});
}
});
});
//New Route
app.get('/blogs/new', (req, res) => {
res.render('new');
});
//Create Route
app.post('/blogs', (req, res) => {
//Create Blog
Blog.create(req.body.blog, (err, newBlog) => {
if (err) {
res.render('new');
} else {
//Then, Redirect to Index
res.redirect('/blogs');
}
});
});
//Show Route
app.get('/blogs/:id', (req, res) => {
Blog.findById(req.params.id, (err, foundBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.render('show', {
blog: foundBlog
});
}
});
});
//Edit Route
app.get('/blogs/:id/edit', (req, res) => {
Blog.findById(req.params.id, (err, foundBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.render('edit', {
blog: foundBlog
});
}
});
});
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findOneAndUpdate(req.body.id, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
////Starts Server
app.listen(port, () => console.log(
`YelpCamp is running at http://localhost:${port}`
));
//edit.js file
<%- include('partials/header') %>
<div class="ui main text container segment">
<div class="ui huge header">
Edit <%= blog.title %>
</div>
<form class='ui form' method="POST" action="/blogs/<%= blog._id %>?_method=PUT" >
<div class="field">
<label>Title</label>
<input class="ui input" type="text" name="blog[title]" value="<%= blog.title %>">
</div>
<div class="field">
<label>Image</label>
<input class="ui input" type="text" name="blog[image]" value='<%= blog.image %>'>
</div><div class="field">
<label>Blog Post</label>
<textarea name="blog[body]"><%= blog.body %></textarea>
</div>
<input class='ui basic button red big' type="submit">
</form>
</div>
<%- include('partials/footer') %>
我认为问题出在更新路径上,您正在使用 findOneAndUpdate
并只将 id
传递给它,而您应该将 object
作为过滤器传递给它
此外,id
在 params
对象中而不在正文中,因此我们必须使用 req.params.id
而不是 req.body.id
所以我猜你有两种选择来解决这个问题
1- 使用 findOneAndUpdate
,但传递一个对象作为过滤器
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findOneAndUpdate({ _id: req.params.id }, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
2-或者使用findByIdAndUpdate
,这里可以直接传id
//Update Route
app.put('/blogs/:id', (req, res) => {
Blog.findByIdAndUpdate(req.params.id, req.body.blog, (err, updatedBlog) => {
if (err) {
res.redirect('/blogs');
} else {
res.redirect('/blogs/' + req.params.id);
}
});
});
希望对您有所帮助