Dereck Bearsong
Dereck Bearsong

Reputation: 1

module exports in node.js returning undefined, should be returning a mongodb object

I have an app that I used before to make a blog site that pulls from MongoDB. I'm trying to incorporate it as a page on a new personal site and am trying to load it as a module in the new personal site. When I do this though, I'm running into problems where I cannot pass the object back over to the personal site's app.js file, it returns undefined whenever I test what it's trying to return.

For example I require the external js file and try to test calling on a function within it

const blog = require(__dirname + "/blog.js")

...
...

// testing area for exports modules
console.log(blog.loadPosts());


// App listen function to set up the connection on port 30000
app.listen(process.env.PORT || 3000, function() {
  console.log("Server started on port 3000");
});

In the blog.js file I'm calling on the code like so

exports.loadPosts = function() {
  Post.find({},
    function(err, foundPosts){
      console.log(foundPosts);
      return foundPosts;
    });
}

I have the console.log within the callback function for the mongoose find to test and display the object, but clearly the order of operations appears to be having it return from the function before the foundPosts is loaded with the object data. This is the console.log return (this also includes a listen log from the app.js file)

[
  {
    _id: 5ef24aa2a26ca95c54c2f1cc,
    title: 'test',
    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
    __v: 0
  },
  {
    _id: 5ef24aff8e303724247d28de,
    title: 'test 2',
    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.',
    __v: 0
  },
  {
    _id: 5ef24ef9306fc62ab0d9e8a1,
    title: 'test 4',
    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Diam phasellus vestibulum lorem sed risus ultricies tristique. Sagittis id consectetur purus ut faucibus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Nam aliquam sem et tortor consequat id. Sit amet purus gravida quis blandit turpis cursus in. Nisi est sit amet facilisis magna etiam. Nisl tincidunt eget nullam non. Risus sed vulputate odio ut enim blandit volutpat maecenas volutpat. Ante in nibh mauris cursus mattis molestie a.\r\n' +
      '\r\n' +
      'Ornare massa eget egestas purus viverra accumsan. Eget nullam non nisi est sit amet facilisis. Eget egestas purus viverra accumsan. Nunc mattis enim ut tellus elementum sagittis. Consequat interdum varius sit amet. Mauris in aliquam sem fringilla ut morbi tincidunt augue interdum. Purus faucibus ornare suspendisse sed nisi lacus. Mauris sit amet massa vitae. Fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel. Nam at 
. Mauris in aliquam sem fringilla ut morbi tincidunt augue interdum. Purus faucibus ornare suspendisse sed nisi lacus. Mauris sit amet massa vitae. Fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel. Nam at 
lectus urna duis convallis convallis tellus id interdum. Id donec ultrices tincidunt arcu non sodales neque sodales. Nec dui nunc mattis enim ut. Aliquet lectus proin nibh nisl condimentum id. Id velit ut tortor pretium viverra. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo. Diam vulputate ut pharetra sit amet aliquam id. Feugiat in fermentum posuere urna nec. In massa tempor nec feugiat nisl. Rhoncus urna neque viverra justo nec.',
    __v: 0
  },
  {
    _id: 5ef24f1d306fc62ab0d9e8a2,
    title: 'test 5',    content: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Diam phasellus vestibulum lorem sed risus ultricies tristique. Sagittis id consectetur purus ut faucibus. Nibh ipsum consequat nisl vel pretium lectus quam id leo. Nam aliquam sem et tortor consequat id. Sit amet purus gravida quis blandit turpis cursus in. Nisi est sit amet facilisis magna etiam. Nisl tincidunt eget nullam non. Risus sed vulputate odio ut enim blandit volutpat maecenas volutpat. Ante in nibh mauris cursus mattis molestie a.\r\n' +
      '\r\n' +      'Ornare massa eget egestas purus viverra accumsan. Eget nullam non nisi est sit amet facilisis. Eget egestas purus viverra accumsan. Nunc mattis enim ut tellus elementum sagittis. Consequat interdum varius sit amet. Mauris in aliquam sem fringilla ut morbi tincidunt augue interdum. Purus faucibus ornare suspendisse sed nisi lacus. Mauris sit amet massa vitae. Fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel. Nam at 
lectus urna duis convallis convallis tellus id interdum. Id donec ultrices tincidunt arcu non sodales neque sodales. Nec dui nunc mattis enim ut. Aliquet lectus proin nibh nisl condimentum id. Id velit ut tortor pretium viverra. Metus vulputate eu scelerisque felis imperdiet proin fermentum leo. Diam vulputate ut pharetra sit amet aliquam id. Feugiat in fermentum posuere urna nec. In massa tempor nec feugiat nisl. Rhoncus urna neque viverra justo nec.',
    __v: 0
  }
]

I cannot figure out why it's completing the return before it completes the rest of the function. I figure it's that I'm not understanding the asynchronous operation but I'm not 100% sure if that's correct. Please help.

Upvotes: 0

Views: 24

Answers (2)

Yoann Picquenot
Yoann Picquenot

Reputation: 660

exports.loadPosts = function() {
  Post.find({},
    function(err, foundPosts){
      console.log(foundPosts);
      return foundPosts;
    });
}

This function does not return anything. So the console.log(blog.loadPosts); will print undefined.

EDIT.

If you want to return the object anyway, you must return it by a promise or async/await.

exports.loadPosts = function() {
  return Post.find({}).toArray();
}

// In the file you want to call that function
Blog.loadPosts().then(function(foundPosts) {
  console.log(foundPosts);
});

Upvotes: 0

razouq
razouq

Reputation: 101

you have to wait until mongoose find your data

  exports.loadPosts = async function() {
  await Post.find({},
    function(err, foundPosts){
      console.log(foundPosts);
      return foundPosts;
    });
}

Upvotes: 1

Related Questions