teelou teelou - 5 months ago 12
Node.js Question

Expressjs + Mongoose - This webpage is not available?

Why mongoose crashes the expressjs site?

Below is my code:

var express = require('express');
var mongoose = require('mongoose');
var app = express();

// Connect to mongodb
mongoose.connect("mongodb://localhost/testdb", function(err) {
if (err) throw err;
console.log("Successfully connected to mongodb");

// Start the application after the database connection is ready
app.listen(3000);
console.log("Listening on port 3000");
});

// With Mongoose, everything is derived from a Schema. Let's get a reference to it and define our users.
var userSchema = mongoose.Schema({
name: String,
username: { type: String, required: true, unique: true },
password: { type: String, required: true },
admin: Boolean,
location: String,
meta: {
age: Number,
website: String
},
created_at: Date,
updated_at: Date
});

// The next step is compiling our schema into a Model.
var User = mongoose.model('User', userSchema);

// Set route.
app.get("/", function(req, res) {

// We can access all of the user documents through our User model.
User.find(function (err, users) {
if (err) return console.error(err);
console.log(users);
})
});


I get this on browser:

This webpage is not available


But in my terminal I get the result:

Successfully connected to mongodb
Listening on port 3000

[ { _id: 57682f69feaf405c51fdf144,
username: 'testuser1',
email: 'testuser1@testdomain.com' },
{ _id: 57683009feaf405c51fdf145,
username: 'testuser2',
email: 'testuser2@testdomain.com' },
{ _id: 57683009feaf405c51fdf146,
username: 'testuser3',
email: 'testuser3@testdomain.com' }]


Any ideas what I have missed?

Answer

The problem is that you are not writing anything in the response object in your request handler. Therefore the browser keeps waiting for the request to finish and ends up with a timeout. In your app.get(), you can update the response like this:

// Set route.
app.get("/", function(req, res) {

  //  We can access all of the user documents through our User model.
  User.find(function (err, users) {
    if (err) {
        console.error(err);
        // some simple error handling, maybe form a proper error object for response.
        res.status(500).json(err);
    }
    console.log(users);
    res.status(200).json(users);  // setting the object as json response

    //OR

    // res.end();   if you don't want to send anything to the client
  })
});

or something similar.

Refer the Express documentation for more details:http://expressjs.com/en/api.html#res