TypeError:db.collection 不是函数

新手上路,请多包涵

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

服务器.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);
    });

})

数据库.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 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 427
2 个回答

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

});

原文由 Mihir Bhende 发布,翻译遵循 CC BY-SA 4.0 许可协议

所以我投票赞成只降到 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

原文由 Jake Boomgaarden 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题