Carson
Carson

Reputation: 1257

Node/Express app hangs whenever interfacing with MongoDB, no errors given

I'm trying to create a CRUD REST API in NodeJS, Express, and Mongodb.

I did something to break all my routes where they no longer return responses. No errors, nothing in the console, etc. I'm not sure what happened, I had it working before. Through just some console.logs I figured out it was freezing whenever it interfaced with the database.

Now, when I send a post request in Postman, it just hangs with 'Loading request'. I'm sending my request as a raw JSON in the body and a content type of application/json; charset=UTF-8 in the header.

{"username":"zezimaUsername","rsn":"Zezima","avatar":"http://secure.runescape.com/m=avatar-rs/Zezima/chat.png"}

They seem to all be hanging once they interact with Mongodb. I have Mongodb running locally with the mongod --port 27017 and created my database with two collections (user and posts) in Mongodb Compass.

I setup my db in a db.js file...

var mongoose = require('mongoose');
var url = 'mongodb://localhost:27017/my-group';
mongoose.connect(url);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB connection error: '));

module.exports = db;

And start my app with my server.js...

var express = require('express');
var api = require('./api');
var app = express();

app.use(express.json());

app.use('/api', api);

//Error handling, don't return stack trace to user, log in console.
app.use(function (err, req, res, next){
  console.log(err.stack);
  res.status(500).send('Something went wrong, internal server error.');
});

app.listen(3000, function(){
  console.log("Listening on port 3000");
});

And define my routes in my api.js file...

var express = require('express');
var router = express.Router();
var User = require('./db/models/User');
var Post = require('./db/models/Post');

router.post('/register', function(req, res){
  var user = new User(req.body);
  user.save()
    .then(function(item){
      res.status(200).send({message: "User successfully created.", status: 200});
    })
    .catch(function(err){
      res.status(400).send({message: "User failed to save to database", status: 400});
    });
});

router.get('/user/:username', function(req, res){
  var query = User.findOne({"username": req.params.username});
  query.exec(function(err, user){
    if(user === null){
      res.status(404).send({message: "User not found", status: 404});
    }else{
    res.status(200).send(user);
    }
  });
});

router.post('/create_post', function(req, res){
  var post = new Post(req.body);
  post.save()
    .then(function(item){
      res.status(200).send({message: "Post successfully created.", status: 200});
    })
    .catch(function(err){
      console.log(err);
      res.status(400).send({message: "Post failed to save to database", status: 400});
    });
});

router.get('/post/id/:id', function(req, res){
  var query = Post.findOne({"_id":req.params.id});
  query.exec(function(err, post){
    if(post === null){
      res.status(404).send({message: 'Post not found', status: 404});
    }else{
      res.status(200).send(post);
    }
  });
});

router.get('/post/boss/:boss', function(req, res){
  var query = Post.find({"boss":req.params.boss});
  query.exec(function(err, post){
    if(post === null){
      res.status(404).send({message: 'Post not found', status: 404});
    }else{
    res.status(200).send(post);
    }
  });
});

module.exports = router;

And just to be complete...my models look like...

User.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var userSchema = new Schema({
  username:{
    type: String,
    required: true
  },
  rsn:{
    type: String,
    required: true
  },
  avatar:{
    type: String,
    required: true
  },
  posts:[{
    type: Schema.Types.ObjectId,
    ref: 'posts'
  }]
});

var user = mongoose.model('users', userSchema);
module.exports = user;

and Post.js

var mongoose = require('mongoose');
var shortid = require('shortid');
var Schema = mongoose.Schema;

var postSchema = new Schema({
  _id:{
    type: String,
    default: shortid.generate
  },
  username:{
    type: Schema.Types.ObjectId,
    ref: 'users'
  },
  rsn:{
    type: String,
    required: true
  },
  avatar:{
    type: String,
    required: true
  },
  boss:{
    type: String,
    required: true
  }
});

var post = mongoose.model('posts', postSchema);
module.exports = post;

I'm not sure what's happening, I keep reading a bunch of various tutorials and the documentation but I'm just not seeing the issue I'm having.

Upvotes: 1

Views: 786

Answers (1)

Amit Dimri
Amit Dimri

Reputation: 691

You have not required your db.js file in your server.js file.

Require it after var express = require('express');

let db = require("./db");

Then it will work fine.

Upvotes: 1

Related Questions