【问题标题】:Unable to connect to mongoDB using mongoose无法使用 mongoose 连接到 mongoDB
【发布时间】:2015-01-28 12:47:24
【问题描述】:

我正在关注这本书 addyosmani - backbone-fundamentals 创建一个简单的以节点服务器和 mongodb 作为后端的主干.js 应用程序。

按照指示,我从nodejs.org 安装了最新版本的 Node.js,从 www.mongodb.org 安装了 mongodb,并按照 instructions 运行了 mongodb。


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

数据库当前正在使用默认数据库“test”侦听默认端口。

我在 mongo shell 中尝试了use library_database,但仍然从节点服务器得到相同的响应。

我是否需要为应用程序手动创建一个数据库..?如果是这样,我如何为应用程序创建一个实例并从节点服务器连接到它..?

或者猫鼬会自动在应用程序根文件夹中创建这样一个数据库(不太可能发生)..?

我对@9​​87654340@、mongodbmongoose 等还是很陌生,所以我可能会遗漏一些基本概念。我错过了什么..?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    我刚刚在文档中找到了 connectcreateConnection 的示例:

    mongoose.connect('mongodb://user:pass@localhost:port/database');
    //-----------------------------------------------^
    

    教程如下:

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

    它缺少端口号。我通过添加默认端口号来更改它,如下所示:

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

    现在我收到了回复!

    【讨论】:

    • 在某些 mongodb 版本(如 3.0+)中需要端口号 它在添加端口号后工作。好收获!
    【解决方案2】:

    mongoose documentation 可能会对您有所帮助

    重要!如果您使用 mongoose.createConnection() 但尝试通过 mongoose.model('ModelName') 它不会按预期工作,因为它是 未连接到活动的数据库连接。在这种情况下,访问您的 通过您创建的连接建模:

    var conn = mongoose.createConnection('你的连接字符串') , MyModel = conn.model('ModelName', schema) , m = new MyModel; m.save(); // 有效 vs

    var conn = mongoose.createConnection('你的连接字符串') , MyModel = mongoose.model('ModelName', schema) , m = new MyModel; m.save(); // 不起作用 b/c 默认连接对象从来没有 已连接

    【讨论】:

      【解决方案3】:

      1) 您不需要显式创建数据库。如果数据库不存在,MongoDB 将在第一条记录插入任何集合时自动创建一个。

      2)我认为您只需将一些书籍插入到集合中(通过 mongo shell,或在您的代码中引导它),您应该是 A 了。您得到的空响应是因为集合中还没有书籍,所以我猜您正在发送一个空值:return response.send(books);

      【讨论】:

        【解决方案4】:

        这就是我的连接方式。

        var mongoose = require('mongoose/');
        var db = mongoose.connect('mongodb://localhost/newdbcoll');
        
        
        //e.g. mongodb://username:server@mongoserver:10059/somecollection
        //mongoose_auth: 'mongodb://admin:admin@127.0.0.1:27017/chrome-server'
        

        而且我可以连接。

        【讨论】:

        • 这里如果 'newdbcoll' db 在 mongodb 中不存在,那么会创建一个具有相同名称的新 db,否则会引发错误?
        • @RahulSharma 它不会抛出任何类型或错误,当您在集合中插入文档时,将创建数据库。
        • 嘿,我有一种情况,我正在使用收集来处理用户数据。几天前它很好并且格式化了我的机器,所以数据库被删除了。现在如果我尝试注册,由于有新的数据库,Mongodb findOne 查询永远不会返回。任何帮助将不胜感激。
        • @Charlie,您使用的是 mongoose ODM 还是任何其他......您能否还指定您使用的版本?我认为这将有助于复制错误。
        • @Varun:感谢您的回复,我是节点新手,不清楚什么是猫鼬 ODM。我的 package.json 有 "mongodb": "^2.2.35" 和 "mongoose": "^4.13.12" .
        猜你喜欢
        • 2020-02-22
        • 2020-07-25
        • 1970-01-01
        • 2021-02-17
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多