node.js-TypeError:db.collection不是函数

我正在尝试将数据发布到在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); 
    });

})

db.js

module.exports = {
  url : "mongodb://JayTanna:Jay12345@ds147510.mlab.com:47510/testing"
};

index.js

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

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

};

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]);
      }
    });
  });
};
Jay Tanna asked 2019-10-09T09:52:07Z
15个解决方案
223 votes

因此,我投票支持回答说只能降到mongodb 2.2.33的答案,因为我尝试了它并且起作用了,但是后来我感到很奇怪,只是降级以解决问题,所以我找到了允许您保持版本> =的解决方案。 3.0。 如果有人发现此问题,而他们的问题没有传递空白参考(例如已接受的答案),请尝试此解决方案。

当你跑..

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

在mongodb版本> = 3.0中,该database变量实际上是您尝试使用database.db().collection('theCollectionIwantToAccess');访问的对象的父对象。要访问正确的对象,您需要引用数据库名称,对我而言

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

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

(此外,如果由于某种原因不知道数据库名称,只需执行console.log(database),您就会将其视为对象属性)


编辑(2018年6月):

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

因此,要获取数据库实例,我们需要使用此方法,该方法采用database.db().collection('theCollectionIwantToAccess');。在文档中它表示为database,如@divillysausages在下面的注释中所述。

简而言之,如果dbName是由url提供的,则应调用database.db().collection('theCollectionIwantToAccess');,其中database实际上是client

Jake Boomgaarden answered 2019-10-09T09:53:48Z
34 votes

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

"dependencies": {
   "mongodb": "^2.2.33"
}

然后

npm install

还有你

antikytheraton answered 2019-10-09T09:54:21Z
19 votes
MongoClient.connect(uristring, function (err, database) {
      var db=database.db('chatroomApp');
      var collections=db.collection('chats');
});

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

Shashi Kiran answered 2019-10-09T09:54:46Z
12 votes

根据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');
});

不需要降级mongo版本:)

Dilum Darshana answered 2019-10-09T09:55:17Z
10 votes

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

npm uninstall mongodb --save

npm install mongodb@2.2.33 --save

PS:感谢@MihirBhende和@yaxartes

仅供参考

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

Naveen Kumar V answered 2019-10-09T09:56:04Z
8 votes

在server.js中,您传递了一个空对象,您需要在其中传递数据库作为第二个参数,这是您的route / 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); 
    });

});
Mihir Bhende answered 2019-10-09T09:52:26Z
5 votes

我遇到了同样的问题。 自创建视频以来,似乎已更新了用于节点的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();
    });

});  

被替换为

 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();
        });

    });  

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

Pulkit Aggarwal answered 2019-10-09T09:56:44Z
1 votes
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) => {
...

db->客户端

module.exports = function(app, client) {
  var db = client.db("name");
  app.post('/notes', (req, res) => {
  const note = { text: req.body.body, title: req.body.title };
  db.collection('notes').insert(note, (err, result) => {
...
Yong-bin Jeong answered 2019-10-09T09:57:10Z
1 votes

对于最新版本,我使用的是server.js下面的代码解决了我的问题

server.js

MongoCLient.connect(db.url,(err,client)=>{
    var db=client.db('notable123');
    if(err){
    return console.log(err);
    }
    require('./server-app/routes')(app,db);
    app.listen(port, ()=> {
        console.log("we are live on : "+ port);
    })

})

你的邮政编码就像

module.exports = function(app,db) {
    app.post('/notes',(req,res)=>{
        const note= {text: req.body.body,title:req.body.title};
        db.collection('notes').insertOne(note,(err,result)=>{
            if(err) {
                res.send({"error":"Ann error has occured"}); 
            } else {
                res.send(result.ops[0])
            }
        });
    });
};
Krish answered 2019-10-09T09:57:49Z
0 votes

在您的package.json中。

确保以下版本看起来像这样:

"nodemon": "^1.12.1"
"mongodb": "^2.2.33"

上面的nodemon和mongodb版本可以一起工作,没有任何错误。所以您的package.json应该看起来像这样:

    {
  "name": "myapi",
  "version": "1.0.0",
  "description": "Json Api",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "nodemon server.js"
  },
  "author": "Riley Manda",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2",
    "mongodb": "^2.2.33"
  },
  "devDependencies": {
    "nodemon": "^1.12.1"
  }
}

降级后不要忘记运行npm install

RileyManda answered 2019-10-09T09:58:37Z
0 votes

同样也有这个问题,我正在遵循一个教程,演示者在其中使用集合作为函数。 它从来没有为我工作。 我发现演示者正在使用mongodb npm模块的2.3.4版本。 该模块现在已经很好地进入了3.x.x版本。 当我更改package.json文件以请求mogodb npm模块的2.x.x版本时,突然一切正常。

我认为发生的事情是模块被更改为将集合更改为另一个对象。 不知道如何使用新版本,但是如果您指定要使用2.x.x版本,则应该使用旧方法。 具体来说,我可以确认(来自package.json文件的“ dependencies”部分)“ mongodb”:“ ^ 2.2.31”有效。

最好的办法:

$> npm install mongodb@2.2.31 --save
PhiipT answered 2019-10-09T09:59:17Z
0 votes

工作代码使用:

npm version 6.0.1,
Node version 10.1.0
"body-parser": "^1.18.3",
"express": "^4.16.3",
"mongodb": "^3.1.0-beta4"
"nodemon": "^1.17.4"

这是routes/note_routes.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, { useNewUrlParser: true },  (err, client)=>{
    var db = client.db('notable');
    if (err) return console.log(err)

    require('./app/routes')(app, client);
    app.listen(port,()=>{
        console.log('we are live at '+ port);
    });
})

这是routes/note_routes.js代码:

module.exports = {
    url:"mongodb://127.0.0.1:27017"
}

这是routes/note_routes.js

 var ObjectId = require('mongodb').ObjectID;
 module.exports= function (app, client) {
        var db = client.db('notable');
        //find One
        app.get('/notes/:id', (req, res)=>{
                const id =req.params.id;
                const details ={'_id': new ObjectId(id)}
                db.collection('notes').findOne(details, (err, item)=>{
                    if(err)
                    {
                        res.send({'error':"An error has occured"})
                    }
                    else
                    {
                        res.send(item)
                    }
                });
            });
            //update rout
            app.put('/notes/:id', (req, res)=>{
                const id =req.params.id;
                const details ={'_id': new ObjectId(id)}
                const note ={text: req.body.body, title: req.body.title};
                db.collection('notes').update(details, note, (err, item)=>{
                    if(err)
                    {
                        res.send({'error':"An error has occured"})
                    }
                    else
                    {
                        res.send(item)
                    }
                });
            });

            //delete route
            app.delete('/notes/:id', (req, res)=>{
                const id =req.params.id;
                const details ={'_id': new ObjectId(id)}
                db.collection('notes').remove(details, (err, item)=>{
                    if(err)
                    {
                        res.send({'error':"An error has occured"})
                    }
                    else
                    {
                        res.send("Note "+id+"deleted!")
                    }
                });
            });
            //insert route
            app.post('/notes', (req, res)=>{
                const note ={text: req.body.body, title: req.body.title};
                db.collection('notes').insert(note, (err, results)=>{
                    if(err)
                    {
                        res.send({'error':"An error has occured"})
                    }
                    else
                    {
                        res.send(results.ops[0])
                    }
                });

            });
        };
Sanaullah Ahmad answered 2019-10-09T10:00:01Z
0 votes

非常感谢Dilum Darshana! 您的建议很有帮助。 我只想补充一点,如果您使用promises,它将看起来像这样:

let db;
MongoClient.connect('mongodb://localhost/collectionName').then(connection => {
    db = connection.db('collectionName');
    app.listen(3000, () => {
        console.log("App started on port 3000");
    }); 
}).catch(error => {
    console.log('ERROR:', error);
});
Alexandr Shmidt answered 2019-10-09T10:00:27Z
0 votes

不要在连接网址中使用数据库名称:

const mongo_url = 'mongodb://localhost:27017'

而是使用以下方法:

MongoClient.connect(mongo_url , { useNewUrlParser: true }, (err, client) => {
        if (err) return console.log(err)
        const  db =  client.db('student')
        const collection = db.collection('test_student');
        console.log(req.body);
        collection.insertOne(req.body,(err,result)=>{
            if(err){
                res.json(err);
            }
            res.json(result);
        });
    });
Ravi Jaisawal answered 2019-10-09T10:00:59Z
0 votes
const MongoClient = require('mongodb').MongoClient;

//connection url

 const url = 'mongodb://localhost:27017/myproject';

 MongoClient.connect(url,{useNewUrlParser: true},(err,client)=> {
  if(err) {
    return console.dir(err)
  }

   console.log('Connected to MongoDB')

  //get the collection
  let db = client.db('myproject');
  db.collection('users').insertOne({
  name: 'Hello World',
  email: 'helloworld@test.com'

  },(err,result)=> {
  if(err) {
      return console.dir(err)
  }
  console.log("Inserted Document");
  console.log(result);

     });
   });
Tikaram Mardi answered 2019-10-09T10:01:18Z
translate from https://stackoverflow.com:/questions/43779323/typeerror-db-collection-is-not-a-function