node.js - TypeError : db. 集合不是函数

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

最佳答案

所以我投票给了答案,说只是降级到 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 月):

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

因此,要获取数据库实例,我们需要使用this method ,它接受一个 dbName。在文档中它说如果未提供,请使用连接字符串中的数据库名称。,正如@divillysausages 在下面的评论中提到的那样。

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

https://stackoverflow.com/questions/43779323/

相关文章:

javascript - 我可以确定一个字符串是否是 MongoDB ObjectID 吗?

mongodb - MongoDB 3.0 中的“无法取消链接套接字文件”错误

mongodb - MongoDB 数据库中的数据如何存储在磁盘上?

javascript - 如何将参数传递给 Mongo 脚本

mongodb - 查询 bool 字段为 "not true"(例如,错误或不存在)

node.js - 保持打开 MongoDB 数据库连接

mongodb - 如何在 Mongoose 中查询不同的值?

mongodb - 检查当前与 MongoDb 的连接数

mongodb - 在同一数据库中复制集合的最快方法是什么?

javascript - 如何使用对象 ID 数组创建 Mongoose 模式?