Поиск документа MongoDB по ObjectId с Мангустом

Я пытаюсь обновить документ в MongoDB, найдя его ObjectId. Рабочий процесс выглядит следующим образом (это для блога).

  1. создайте новый пост в MongoDB, передав заголовок и тело. ObjectId создается автоматически.
  2. перейти к редактированию сообщения. Он использует ObjectId из URL, чтобы захватить его из базы данных и отобразить его в той же новой форме post, только с уже существующими значениями.
  3. когда кнопка отправки нажата, я хочу найдите документ с помощью 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"));
});

таким образом, мы перенаправляем только после успешного обновления модели