TypeError:db.collection不是函数


69

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

在index.js中,我看不到您在哪里声明db-您是否需要它?
亚历克斯(Alex)

如果您想学习mongoDB,则可以下载NPM Mongo Modelsnpmjs.com/package/mongo-models beautifull节点包,您可以打开Mongo Models代码并从中学习。
Titus Sutio Fanpula

Answers:


9

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

});

req.body.body和req.body.title都给了我'undefind',您看到这有什么问题吗?
杰伊(Jay)

您需要添加app.use(bodyParser.json()); 中间件
Mihir Bhende '17

标题来自帖子,还是它是URL slug参数?
米希尔·本德

不。当我执行console.log(req.body)时,都给了我标题和正文,但是当我执行console.log(req.body.body)时,给了我未定义的东西。
杰伊(Jay)

只要确保我正确,当您执行console.log(req.body)时,您将获得属性title和body,然后尝试登录req.body.title和req.body.body。您能否仔细检查一下这些是否只是req的req.body属性?
Mihir Bhende '17

235

因此,我投票支持回答说只能降到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(database),您就会将其视为对象属性)


编辑(2018年6月):

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

因此,要获取数据库实例,我们需要使用此方法该方法采用dbName。在文档中说If not provided, use database name from connection string.,如@divillysausages在下面的评论中提到的。

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


我尝试了同样的事情,但是在database.db('dbname')提供db对象之前调用了db.collection查询。并因此得到相同的错误消息
Aman Gupta

虽然,database.db('dbname')提供了正确的对象,但之前已经执行了查询却给出了错误
Aman Gupta

8
这是V2和V3之间的重大更改的列表
Yoav

2
我对MongoDB自己的文档甚至没有显示这一点感到困惑。
Brett84c

5
仅供参考,如果您的连接字符串包含数据库名称(例如mongodb://localhost:27107/MyDB,那么它将被设置为返回的MongoClient的默认名称(database在此示例中)。这使您可以调用database.db()以获取实际的数据库
divillysausages,

36

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

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

然后

npm install

还有你


1
令人难以置信的是问题出在mongodb上的版本。我的package.json默认通过npm install mongodb --save大捕获@yaxartes安装了3.0.0-rc0
David

7
@DavidAnderton这个问题与MongoDB无关,只是一个语法问题。如果您不想降级mongodb,请参见下面的解决方案,希望对您有所帮助!
杰克·邦加登

@antikytheraton降级不是最佳解决方案,需要正确的语法
Ganesh

@Ganesh我同意你的看法。该解决方案是我的方式来解决的时候蒙戈直接在那个时候更新到3.0版本这个问题
antikytheraton

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

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


15

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


因此,我传递URL的深度将使我只有一个客户端。是不是
Shubham Agarwal Bhewanewala


8

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

    });  

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


4

对于我使用的最新版本,"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])
            }
        });
    });
};

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

3

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

网址应包含集合名称吗?我在看mongodb.github.io/node-mongodb-native/driver-articles / ...,除非您的数据库和集合被命名为相同的名称,否则URL格式似乎不支持该格式?
Arman

我认为是的,因为您需要为目标使用某个对象,并且无论如何,该对象还是某些集合的一部分,而这正是数据库的一部分。当然,如果我正确理解了您的问题。
Alexandr Shmidt

1

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


1

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

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

最好的办法:

$> npm install mongodb@2.2.31 --save

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”。


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

            });
        };

0

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

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

请在答案中添加更多内容,以解释OP为什么要使用您的代码以及它如何解决他们的问题!
MBT

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

     });
   });


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.