S M Abrar Jahin
S M Abrar Jahin

Reputation: 14598

Node.JS Express 4 - Mongoose Does not saving data

I am trying to save a data in MongoDB with Mongoose with Express.JS 4 and Bluebird.

What I have done is like this-

bin/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");
});

And getting this in console-

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

models/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'
                }
            );
});

And after that I am getting this in console-

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

But, nothing is saved, a proof for that is -

I am finding this-

enter image description here

After using MongoBooster.

Update-

My DB config is like this-

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

So, can anyone please help, why it is not saving anything?

Thanks in advance for helping.

Upvotes: 4

Views: 836

Answers (5)

Shaishab Roy
Shaishab Roy

Reputation: 16805

if you store post schema in a variable by require then can use that variable.

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

so can use new Post_Data no need to use var Post = mongoose.model("Post"); because you have already exported this schema module.exports = mongoose.model('Post', postSchema);

you can try this one :

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'
      });
   });
});

Upvotes: 1

Paul
Paul

Reputation: 36349

So it's true that if you're creating a document in memory by calling new Post(values) that you will save it with post.save(cb); rather than '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` variable isn't shown to be declared in the code you posted, so I'm making it an assumption.

That said, if I'm right, you need to call mongoose.connect or mongoose.createConnection in order for Mongoose to know it's connected to the db and save documents to it. You can pass an existing connection to mongoose, so if you're already doing so then I apologize for my erroneous assumption.

Upvotes: 0

chridam
chridam

Reputation: 103475

You are calling the wrong model in your app.js module as you are importing the model as

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

but creating a new Post model instance in your router implementation as

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

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

You need to call and use the correct models. So I would suggest you re-write your app.js module to use the save() method as:

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);
    });
});

Upvotes: 1

Matt
Matt

Reputation: 74899

The .create() function is a shortcut for new Model and .save(). You are trying to .create an instance of Model rather than a simple Object. See Constructing documents in Mongoose's Models documentation for their quick example.

The return from a Mongoose data function is just the promise of an asynchronous task to be run in the future, logging that is largely pointless. Use .then() to wait until the promise has been resolved.

Error handling is missing from your code as well, something could be getting thrown there. Use a .catch() for promise error handling.

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

All of this can be done with callbacks (like the Mongoose docco examples) but promises, particularly bluebird promises are nicer.

Upvotes: 2

Sascha Savila
Sascha Savila

Reputation: 11

I just use this syntax combination to create and save my model:

var myPage = new LandingPage({
  user:req.user,
  slug: req.body.slug,
}).save(function(err,savedModel){
  if(!err){
    console.log(savedModel);
  }
});

Upvotes: 1

Related Questions