2014-11-30 2 views
2

Я следую этой книге addyosmani - backbone-fundamentals для создания простого приложения backbone.js с сервером узлов и mongodb в качестве backend.Невозможно подключиться к mongoDB с помощью mongoose

В соответствии с поручением, я установил последние версии Node.js от nodejs.org и MongoDB из www.mongodb.org и бегал MongoDB по следовало instructions.


package.json выглядит следующим образом:

{ 
    "name": "backbone-library", 
    "version": "0.0.1", 
    "description": "A simple library application using Backbone", 
    "dependencies": { 
     "express": "~3.1.0", 
     "path": "~0.4.9", 
     "mongoose": "~3.5.5", 
     "body-parser": "~1.9.1" 
    } 
} 

tutorial then suggests to добавить следующее server.js файл для подключения к MongoDB:

//Connect to database 
mongoose.connect('mongodb://localhost/library_database'); 

//Schemas 
var Book = new mongoose.Schema({ 
    title: String, 
    author: String, 
    releaseDate: Date 
}); 

//Models 
var BookModel = mongoose.model('Book', Book); 

Я запуталась с помощью следующей строки:

mongoose.connect('mongodb://localhost/library_database'); 

, потому что книга не упоминает ничего о создании базы данных с именем library_database, и я не создан вручную - Тем не менее, если я запускаю следующее в server.js:

mongoose.createConnection('mongodb://localhost/library_database'); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
// we wait till mongo is ready before letting the http handler query users: 
db.once('open', function() { 
    console.log('Running'); 
    //Schemas 
    var Book = new mongoose.Schema({ 
     title: String, 
     author: String, 
     releaseDate: Date 
    }); 

    //Models 
    var BookModel = mongoose.model('Book', Book); 
}); 

Он регистрирует Running ..! (как прийти, потому что я не создавал library_database ..?)

Но, если я дальше следовать книге, добавив обработчик запросов GET, как показано ниже:

//Get a list of all books 
app.get('/api/books', function(request, response) { 
    return BookModel.find(function(err, books) { 
     if(!err) { 
      return response.send(books); 
     } else { 
      return console.log(err); 
     } 
    }); 
}); 

и ударил его с следующий запрос:

jQuery.get('/api/books/', function(data, textStatus, jqXHR) { 
    console.log('Get response:'); 
    console.dir(data); 
    console.log(textStatus); 
    console.dir(jqXHR); 
}); 

Согласно уроку я должен видеть журналы, вместо этого я получаю следующее сообщение об ошибке:

GET http://localhost:4711/api/books/ net::ERR_EMPTY_RESPONSE 

В настоящее время БД прослушивает порт по умолчанию с базой данных «тест» по умолчанию.

Я пробовал use library_database в оболочке mongo, но все равно получаю тот же ответ от узла сервера.

Нужно ли вручную создавать db для приложения ..? Если да, то как я могу создать экземпляр для приложения и подключиться к нему с узла сервера ..?

Или mongoose автоматически создает такой db в корневой папке приложений (вряд ли произойдет) ..?

Я довольно новичок в node.js, mongodb, mongoose и т. Д. Поэтому мне могут быть недостающие основные понятия. Что мне не хватает ..?

ответ

0

1) Вам не нужно явно создавать базу данных. Если база данных не существует, MongoDB автоматически создаст ее, когда первая запись будет вставлена ​​в любую коллекцию.

2) Я думаю, вам просто нужно вставить некоторые книги в коллекцию (через оболочку монго или загрузить ее в свой код), и вы должны быть A для прочь.Пустой ответ, который вы получаете, состоит в том, что в коллекции нет книг, поэтому я предполагаю, что вы отправляете нуль в: return response.send (books);

1

Я только что нашел примеры для connect и createConnection в документации:

mongoose.connect('mongodb://user:[email protected]:port/database'); 
//-----------------------------------------------^ 

Один в учебнике выглядит следующим образом:

mongoose.connect('mongodb://localhost/library_database'); 

Он отсутствует номер порта. Я изменил его, добавив номер порта по умолчанию следующим образом:

mongoose.createConnection('mongodb://localhost:27017/library_database'); 

и теперь я получаю ответ!

+1

номер порта требуется в некоторых версиях MongoDB как 3.0+ Он работал после того, как не добавляя порта нет. Хороший улов! – webblover

0

Вот как я подключился.

var mongoose = require('mongoose/'); 
var db = mongoose.connect('mongodb://localhost/newdbcoll'); 


//e.g. mongodb://username:[email protected]:10059/somecollection 
//mongoose_auth: 'mongodb://admin:[email protected]:27017/chrome-server' 

И я могу подключиться.

+0

здесь, если 'newdbcoll' db отсутствует в mongodb, то создается новый db с тем же именем или выдает ошибку? –

+0

@RahulSharma Он не будет бросать какой-либо тип или ошибку, когда вы вставляете документ в коллекцию, создается БД. –

1

Вы могли бы найти это полезным из mongoose documentation

Important! If you opened a separate connection using mongoose.createConnection() but attempt to access the model through mongoose.model('ModelName') it will not work as expected since it is not hooked up to an active db connection. In this case access your model through the connection you created:

var conn = mongoose.createConnection('your connection string') , MyModel = conn.model('ModelName', schema) , m = new MyModel; m.save(); // works vs

var conn = mongoose.createConnection('your connection string') , MyModel = mongoose.model('ModelName', schema) , m = new MyModel; m.save(); // does not work b/c the default connection object was never connected