TypeError:db.collection不是函数

时间:2017-05-04 09:43:12

标签: node.js mongodb rest 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); 
    });

})

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

18 个答案:

答案 0 :(得分:226)

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

当你跑步时..

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

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

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

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

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

编辑(2018年6月):

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

因此,要获取数据库实例,我们需要使用this method,其中包含dbName。在文档中说If not provided, use database name from connection string.,正如@divillysausages在下面的评论中提到的那样。

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

答案 1 :(得分:34)

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

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

然后

npm install

你在那里

答案 2 :(得分:19)

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

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

答案 3 :(得分:12)

根据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版本:)

答案 4 :(得分:10)

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

npm uninstall mongodb --save

npm install mongodb@2.2.33 --save

PS:感谢@MihirBhende和@yaxartes

<强> FYI,

如果您不熟悉该字段,请选择https://github.com/mongodb/node-mongodb-native/releases的非rc版本。

答案 5 :(得分: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); 
    });

});

答案 6 :(得分: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();
    });

});  

替换为

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

    });  

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

答案 7 :(得分:1)

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 - &gt;客户端

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) => {
...

答案 8 :(得分:1)

对于我使用的最新版本,"mongodb": "^3.1.3"下面的代码解决了我的问题

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

答案 9 :(得分:1)

MongoClient.connect(db.url,(err,database) =>{
    if (err) return console.log(err)
    //require('./app/routes')(app,{});
    //try this 
     require('./app/routes')(app,database);
    app.listen(port,() => {
        console.log("We are live on"+port); 
    });
})

在这里,您必须将数据库包括在空的{}中。

您还可以尝试将mongodb安装到最新版本,这将解决问题。

npm install mongodb@2.2.33 --save 

在其他npm install节点模块中添加“ mongodb”的依赖项:“ ^ 2.2.33”。

答案 10 :(得分:0)

在你的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

答案 11 :(得分:0)

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

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

最佳方式:

$> npm install mongodb@2.2.31 --save

答案 12 :(得分:0)

使用以下工作代码:

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"

以下是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, { 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);
    });
})

以下是config/db.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])
                    }
                });

            });
        };

答案 13 :(得分:0)

非常感谢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);
});

答案 14 :(得分:0)

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

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

答案 15 :(得分:0)

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

     });
   });

答案 16 :(得分:0)

我有一个简单的解决方案:

note_routes.js

char arr[][8]

替换

db.collection('notes').insert(note, (err, result) => {

答案 17 :(得分:0)

我正在做同样的教程,但有同样的问题。我只是检查了所有答案,然后找到了一个答案。

MongoClient.connect(db.url, { useUnifiedTopology: true }, (err, client) => {
var database = client.db('test');
if (err) return console.log(err) 
require('./app/routes')(app, database);
app.listen(port, () => { console.log('We are live on ' + port);}); })

已将数据库更改为客户端,并将数据库定义为client.db('test')