Node.JS Express 4 - Mongoose не сохраняет данные

Я пытаюсь сохранить данные в MongoDB с помощью Mongoose с < strong>Express.JS 4 и Bluebird.

То, что я сделал, похоже на это-

бин/www

var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

.......
.......

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function()
{// successfully connected!
    console.log("Successfully Connected to Mongo-DB");
});

И получить это в консоли-

Successfully Connected to Mongo-DB` - So, MongoDB connected successfully

модели/post.js

var mongoose = require('mongoose');

var postSchema = new mongoose.Schema({
    created_by: String,     //should be changed to ObjectId, ref "User"
    created_at: {type: Date, default: Date.now},
    text: String
});

module.exports = mongoose.model('Post', postSchema);

app.js

var Post_Data = require("./models/post");
....
....
router.get('/', function(req, res, next)
{
    var Post = mongoose.model("Post");

    var post    =   new Post({
                            created_by: ""+Math.random()
                        });

    console.log( Post.create(post) );


    res.render(
                'index',
                {
                    title       :   'Express',
                    site_name   :   'Our Site',
                    layout      :   'templates/layout'
                }
            );
});

И после этого я получаю это в консоли-

Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined }

Но ничего не сохраняется, доказательством этому является -

Я нахожу это-

введите здесь описание изображения

После использования MongoBooster.

Обновлять-

Моя конфигурация БД такая:

"MONGO_URI": "mongodb://localhost:27017/express_test",
"MONGO_OPTIONS": {
                    "db": { "safe": true },
                    "name":"express_test"
                }

Итак, может ли кто-нибудь помочь, почему он ничего не сохраняет?

Заранее спасибо за помощь.


person Abrar Jahin    schedule 09.08.2016    source источник


Ответы (5)


Функция .create() — это ярлык для new Model и .save(). Вы пытаетесь .create создать экземпляр Model, а не простой объект. Быстрый пример см. в разделе Создание документов в документации по моделям Mongoose.

Возврат из функции данных Mongoose — это просто обещание асинхронной задачи, которая будет запущена в будущем, ведение журнала которой в значительной степени бессмысленно. Используйте .then(), чтобы подождать, пока обещание не будет разрешено.

В вашем коде также отсутствует обработка ошибок, возможно, там что-то выбрасывается. Используйте .catch() для обработки ошибок обещаний.

Post.create({ created_by: ""+Math.random() })
.then(function (result) {
  console.log('Saved' result)
})
.catch(function (err) {
  console.error('Oh No', err)
})

Все это можно сделать с помощью обратных вызовов (например, примеров документации Mongoose), но промисы, особенно промисы bluebird, приятнее.

person Matt    schedule 09.08.2016
comment
Привет @Matt, это не работает. Есть ли альтернативный способ? - person Abrar Jahin; 09.08.2016
comment
У Mongoose есть привычка тихо сбоить, когда у вас нет открытого соединения, хотя, если вы видели сообщение о соединении и не connection error, то это маловероятно. - person Matt; 09.08.2016

Я просто использую эту комбинацию синтаксиса для создания и сохранения моей модели:

var myPage = new LandingPage({
  user:req.user,
  slug: req.body.slug,
}).save(function(err,savedModel){
  if(!err){
    console.log(savedModel);
  }
});
person Sascha Savila    schedule 09.08.2016
comment
Вы когда-нибудь пробовали это сами? Пожалуйста, не пытайтесь скопировать чужой ответ, чтобы ответить на вопрос. - person Abrar Jahin; 09.08.2016
comment
этот код взят из одного из моих производственных кодов, не копируется и полностью работает! - person Sascha Savila; 09.08.2016

Вы вызываете неправильную модель в своем модуле app.js, так как импортируете модель как

var Post_Data = require("./models/post"); // <-- Post_Data model never used
....
....

но создание нового экземпляра модели Post в реализации вашего маршрутизатора как

var Post = mongoose.model("Post"); // <-- different model

var post    =   new Post({
                        created_by: ""+Math.random()
                    });

Вам нужно позвонить и использовать правильные модели. Поэтому я предлагаю вам переписать модуль app.js, чтобы использовать save() как:

var Post = require("./models/post"); // <-- import correct Post model
....
....
router.get('/', function(req, res, next) {
    var post = new Post({ created_by: ""+Math.random() });
    post.save().then(function(post) {
        console.log(post); // <-- newly created post
        res.render('index', {
            title: 'Express',
            site_name: 'Our Site',
            layout: 'templates/layout'
        });
    })
    .catch(function(err) {
        console.error('Oopsy', err);
    });
});
person chridam    schedule 09.08.2016
comment
mongoose.model('Post') вернет MissingSchemaError, если модель еще не настроена. - person Matt; 09.08.2016

если вы сохраняете схему сообщения в переменной по требованию, вы можете использовать эту переменную.

var Post_Data = require("./models/post");

поэтому можно использовать new Post_Data нет необходимости использовать var Post = mongoose.model("Post");, потому что вы уже экспортировали эту схему module.exports = mongoose.model('Post', postSchema);

вы можете попробовать это:

var Post_Data = require("./models/post");
router.get('/', function(req, res, next)
{
    var post = new Post_Data({created_by: ""+Math.random()});

    post.save(function(error, data) {
      if(error) {
         return res.status(500).send({error: 'Error occurred during create post'});
      }
      return res.render('index',{
          title       :   'Express',
          site_name   :   'Our Site',
          layout      :   'templates/layout'
      });
   });
});
person Shaishab Roy    schedule 09.08.2016

Так что это правда, что если вы создаете документ в памяти, вызывая new Post(values), вы сохраните его с помощью post.save(cb);, а не переменной Post.create(post);, but I'm thinking that the underlying issue (though this isn't easy to be certain of based on the code you're showing) is that you're connecting with the MongoDB driver, rather than mongoose itself. Yourdb`, которая не объявлена ​​​​в опубликованном вами коде, поэтому Я делаю это предположение.

Тем не менее, если я прав, вам нужно вызвать mongoose.connect или mongoose.createConnection, чтобы Mongoose знал, что он подключен к базе данных, и сохранял в нем документы. Вы можете передать существующее соединение mongoose, поэтому, если вы уже это делаете, приношу свои извинения за ошибочное предположение.

person Paul    schedule 09.08.2016