TypeError:db.collection不是函数

Jay*_*nna 62 rest mongodb node.js express

我试图将数据发布到我在mLab上创建的数据库,我收到此错误但我不知道什么是错误.我也读过有关此主题的先前询问的问题,但我无法解决我的错误我是新来的.所以我在这里发布我正在尝试实现的代码,它来自本教程https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30-minutes- a07ea9e390d2.

server.js

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');

const db = require('./config/db');


const app = express();

const port = 8000;

app.use(bodyParser.urlencoded({extened:true}));


MongoClient.connect(db.url,(err,database) =>{

    if (err) return console.log(err)
    require('./app/routes')(app,{});
    app.listen(port,() => {
        console.log("We are live on"+port); 
    });

})
Run Code Online (Sandbox Code Playgroud)

db.js

module.exports = {
  url : "mongodb://JayTanna:Jay12345@ds147510.mlab.com:47510/testing"
};
Run Code Online (Sandbox Code Playgroud)

index.js

const noteroutes = require('./note_routes');

module.exports = function(app,db)
{
    noteroutes(app,db);

};
Run Code Online (Sandbox Code Playgroud)

note_routes.js

module.exports = function(app, db) {
  app.post('/notes', (req, res) => {
    const note = { text: req.body.body, title: req.body.title };
    db.collection('notes').insert(note, (err, result) => {
      if (err) { 
        res.send({ 'error': 'An error has occurred' }); 
      } else {
        res.send(result.ops[0]);
      }
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

Jak*_*den 231

所以我投票给了答案,据说只是下载到mongodb 2.2.33,因为我尝试了它并且它有效,但后来我觉得很奇怪只是降级修复问题所以我找到了允许你保持版本的解决方案> = 3.0.如果有人发现此问题并且他们的问题没有像接受的答案一样传递空白参考,请尝试解决此问题.

当你跑...

MongoClient.connect(db.url,(err,database) =>{ }
Run Code Online (Sandbox Code Playgroud)

在mongodb version> = 3.0中,该database变量实际上是您尝试访问的对象的父对象database.collection('whatever').要访问正确的对象,您需要引用您的数据库名称,对于我来说

MongoClient.connect(db.url,(err,database) =>{ 
  const myAwesomeDB = database.db('myDatabaseNameAsAString')
  myAwesomeDB.collection('theCollectionIwantToAccess')
}
Run Code Online (Sandbox Code Playgroud)

这在运行我的node.js服务器时修复了我的错误,希望这可以帮助那些不仅仅想要降级其版本的人.

(另外,如果由于某种原因你不知道你的数据库名称,只需要做一个console.log(数据库),你会看到它作为一个对象属性)


编辑(2018年6月):

根据,回调实际上返回数据库的连接的客户端,而不是数据库本身.

因此,要获取数据库实例,我们需要使用此方法,它接受一个dbName.在它所说的文件中If not provided, use database name from connection string.,正如@divillysausages在下面的评论中提到的那样.

简而言之,我们应该调用database.db().collection('theCollectionIwantToAccess');dbName是否由url提供,其中database实际上是client为了更好地理解

  • [这里](https://github.com/mongodb/node-mongodb-native/blob/3.0.0/CHANGES_3.0.0.md#api-changes)V2和V3之间的重大变化列表 (8认同)
  • 仅供参考,如果您的连接字符串包含数据库名称(例如`mongodb:// localhost:27107/MyDB`,那么它将被设置为返回的MongoClient的默认值(在此示例中为`database`).这使您可以调用`database.db()`来获取实际的DB (5认同)
  • 我对MongoDB自己的文档甚至没有显示这一点感到困惑。 (2认同)

小智 34

错误发生在mongodb库中.尝试安装版本2.2.33mongodb.删除您的node_modules目录并添加

"dependencies": {
   "mongodb": "^2.2.33"
}
Run Code Online (Sandbox Code Playgroud)

然后

npm install
Run Code Online (Sandbox Code Playgroud)

那就是你

  • @DavidAnderton问题不在于MongoDB,它只是一个语法问题.如果您不想降级mongodb,请参阅下面的解决方案,希望它有所帮助! (7认同)

小智 20

MongoClient.connect(uristring, function (err, database) {
      var db=database.db('chatroomApp');
      var collections=db.collection('chats');
});
Run Code Online (Sandbox Code Playgroud)

在尝试访问集合之前需要先获取数据库.


小智 14

根据mongo文档,我们需要更改连接,如下所示,

The legacy operation
MongoClient.connect('mongodb://localhost:27017/test', (err, db) => {
    // Database returned
});

is replaced with
MongoClient.connect('mongodb://localhost:27017/test', (err, client) => {
    // Client returned
    var db = client.db('test');
});
Run Code Online (Sandbox Code Playgroud)

不需要降级mongo版本:)


Nav*_*r V 10

卸载现有的mongodb软件包并使用以下命令重新安装解决了我的问题.:)

npm uninstall mongodb --save

npm install mongodb@2.2.33 --save
Run Code Online (Sandbox Code Playgroud)

PS:感谢@MihirBhende和@yaxartes

仅供参考,

如果您是该领域的新手,首选https://github.com/mongodb/node-mongodb-native/releases上的非rc版本.


Mih*_*nde 8

在您的server.js中,您传递的是空对象,您需要将数据库作为第二个参数传递给您的routes/index.js导出函数所需的内容.

PFB更新了server.js:

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');

const db = require('./config/db');

const app = express();

const port = 8000;

app.use(bodyParser.urlencoded({extended:true}));

MongoClient.connect(db.url,(err,database) =>{

    if (err) return console.log(err)
    //require('./app/routes')(app,{});
    //check below line changed
     require('./app/routes')(app, database);
    app.listen(port,() => {
        console.log("We are live on"+port); 
    });

});
Run Code Online (Sandbox Code Playgroud)


Pul*_*wal 5

我遇到了同样的问题.看起来自创建视频以来节点的mongodb驱动程序模块已更新.我在文档中找到了以下代码.

var MongoClient = require('mongodb').MongoClient;

var url = 'mongodb://localhost:27017/<dbName>';
MongoClient.connect(url, (err, db) => {
   db.collection('<collection-name>').find({}).toArray(function(err, docs) {

    // Print the documents returned
    docs.forEach(function(doc) {
        console.log(doc);
    });

    // Close the DB
    db.close();
    });

});  
Run Code Online (Sandbox Code Playgroud)

被替换为

 var MongoClient = require('mongodb').MongoClient;

  var url = 'mongodb://localhost:27017'; // remove the db name.
    MongoClient.connect(url, (err, client) => {
       var db = client.db(dbName);
       db.collection('<collection-name>').find({}).toArray(function(err, docs) {

        // Print the documents returned
        docs.forEach(function(doc) {
            console.log(doc);
        });

        // Close the DB
        client.close();
        });

    });  
Run Code Online (Sandbox Code Playgroud)

如果我们遇到进一步的语法问题,这里是最新文档的链接.