Подтвердить что ты не робот

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:[email protected]: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]);
      }
    });
  });
};
4b9b3361

Ответ 1

В вашем 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); 
    });

});

Ответ 2

Поэтому я проголосовал за ответ, в котором говорилось, что нужно перейти на 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 года):

Согласно этому, обратный вызов фактически возвращает подключенного клиента базы данных, а не саму базу данных.

Поэтому, чтобы получить экземпляр базы данных, нам нужно использовать этот метод, который принимает dbName. В документации сказано, что If not provided, use database name from connection string. , как упомянуто @divillysausages в комментариях ниже.

Короче говоря, мы должны вызвать database.db().collection('theCollectionIwantToAccess'); если dbName предоставлено url, где database на самом деле является client для лучшего понимания

Ответ 3

Ошибка в библиотеке mongodb. Попробуйте установить версию 2.2.33 из mongodb. Удалите каталог node_modules и добавьте

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

Тогда

npm install

и там вы

Ответ 4

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

Прежде чем пытаться получить доступ к коллекциям, сначала необходимо получить базу данных.

Ответ 5

Согласно документу Монго, нам нужно изменить соединение, как показано ниже,

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

Не нужно понижать версию Монго :)

Ответ 6

Удаление существующего пакета mongodb и переустановка с помощью следующих команд позволили решить проблемы для меня.:)

npm uninstall mongodb --save

npm install [email protected] --save

PS: Благодаря @MihirBhende и @yaxartes

FYI,

Предпочитайте не-rc-релизы из https://github.com/mongodb/node-mongodb-native/releases, если вы новичок в этом поле.

Ответ 7

Я столкнулся с той же проблемой. Похоже, что модуль драйвера 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();
        });

    });  

Вот ссылка на последние документы на случай, если возникнут дальнейшие проблемы с синтаксисом.

Ответ 8

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

Ответ 9

Для последней версии я использовал "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])
            }
        });
    });
};

Ответ 10

В вашем пакете .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 после понижения

Ответ 11

Если бы у меня была эта проблема, я следовал учебному пособию, в котором докладчик использовал коллекцию как функцию. Это никогда не работало для меня. Я обнаружил, что докладчик использовал версию 2.3.4 модуля mongodb npm. модуль хорошо в версии 3.xx сейчас. Когда я изменил файл package.json для запроса версии 2.xx модуля mogodb npm, вдруг все заработало.

Я верил, что модуль был изменен, чтобы изменить коллекцию на другой объект. Не знаю, как использовать новую версию, но если вы укажете, что хотите версию 2.xx, старый способ должен работать. В частности, я могу подтвердить, что (исходя из моего файла package.json, раздел "зависимости") "mongodb": "^ 2.2.31" работает.

Лучший способ:

$> npm install [email protected] --save

Ответ 12

Рабочий код с использованием:

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

Большое спасибо Дилум Даршана! Ваш совет очень помог. Я просто хочу добавить, что, если вы используете обещания, это будет выглядеть так:

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

Не используйте имя базы данных в 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

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: '[email protected]'

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

     });
   });

Ответ 16

У меня есть простое решение:

note_routes.js

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

замещать

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