Поиск документа MongoDB по ObjectId с Мангустом
Я пытаюсь обновить документ в MongoDB, найдя его ObjectId. Рабочий процесс выглядит следующим образом (это для блога).
- создайте новый пост в MongoDB, передав заголовок и тело. ObjectId создается автоматически.
- перейти к редактированию сообщения. Он использует ObjectId из URL, чтобы захватить его из базы данных и отобразить его в той же новой форме post, только с уже существующими значениями.
- когда кнопка отправки нажата, я хочу найдите документ с помощью ObjectId и обновите значения в базе данных с помощью значений в форме post.
Шаг 1 и 2 работают нормально, но Шаг 3, похоже, не работает. Он перенаправляет на нужную страницу. Но база данных не обновлялась. Это та же ценность, что и раньше.
вот соответствующий код для сообщения обновления часть:
app.js
app.post "/office/post/:id/update", ensureAuthenticated, routes.updatePost
маршруты индекса/.js
mongoose = require 'mongoose'
ObjectId = mongoose.Types.ObjectId
Post = require '../models/Post'
...
updatePost: function(req, res) {
var o_id, the_id;
the_id = req.params.id;
console.log(the_id); // 510e05114e2fd6ce61000001
o_id = ObjectId.fromString(the_id);
console.log(o_id); // 510e05114e2fd6ce61000001
return Post.update({
"_id": ObjectId.fromString(the_id)
}, {
"title": "CHANGE"
}, res.redirect("/office/edit/posts"));
}
я использую Экспресс и Мангуст.
Это также модель post, если это помогает:
(function() {
var Post, Schema, mongoose;
mongoose = require('mongoose');
Schema = mongoose.Schema;
Post = new Schema({
title: String,
subhead: String,
body: String,
publish_date: {
type: Date,
"default": Date.now
},
mod_date: {
type: Date,
"default": Date.now
}
});
module.exports = mongoose.model('Post', Post);
}).call(this);
и вот код для редактирования записи в блоге:
app.js
app.get("/office/post/:id/edit", ensureAuthenticated, routes.editPost);
маршруты индекса/.js
editPost: function(req, res) {
return Post.findById(req.params.id, function(err, post) {
return res.render('edit-post', {
post: post,
title: post.title
});
});
}
1 ответов
проблема в том, как вы называете update
return Post.update({
"_id": ObjectId.fromString(the_id)
}, {
"title": "CHANGE"
}, res.redirect("/office/edit/posts"));
последний аргумент фактически перенаправляет страницу, тогда как update
ожидает, что функция будет вызвана, когда обновление будет завершено
вы должны пройти в
return Post.update({
"_id": ObjectId.fromString(the_id)
}, {
"title": "CHANGE"
}, function(err, model) {
if (err) // handleerr
res.redirect("/office/edit/posts"));
});
таким образом, мы перенаправляем только после успешного обновления модели