web-dev-qa-db-fra.com

TypeError: db.collection n'est pas une fonction

J'essaie de publier les données dans la base de données que j'ai créée sur mLab et j'obtiens cette erreur, mais je ne sais pas ce qui ne va pas. J'ai également lu une question déjà posée sur ce sujet, mais je ne parviens pas à résoudre mon erreur Je suis nouveau à cela. Donc, je poste ici le code que je tente d’implémenter et qui provient de ce tutoriel 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]);
      }
    });
  });
};
56
Jay Tanna

Dans votre server.js, vous transmettez un objet vide pour lequel vous devez passer la base de données comme second argument, comme le prévoit votre fonction d'exportation routes/index.js.

PFB a mis à jour le fichier 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); 
    });

});
8
Mihir Bhende

J'ai donc voté pour la réponse qui disait simplement descendre à mongodb 2.2.33 parce que je l'avais essayée et que ça fonctionnait, mais ensuite je me sentais bizarre de simplement rétrograder pour résoudre un problème. 3.0. Si quelqu'un trouve ce problème et que son problème ne passe pas à une référence vide comme la réponse acceptée, essayez cette solution.

Quand tu cours ..

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

Dans mongodb version> = 3.0, cette variable database est en réalité l'objet parent de l'objet auquel vous essayez d'accéder avec database.collection('whatever'). Pour accéder au bon objet, vous devez référencer votre nom de base de données, pour moi c'était en faisant

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

Cela corrigeait mes erreurs lors de l'exécution de mon serveur node.js. J'espère que cela aidera quelqu'un qui ne veut pas simplement rétrograder sa version.

(de plus, si vous ne connaissez pas votre nom de base de données pour une raison quelconque, utilisez simplement console.log (base de données) et vous le verrez comme un attribut d'objet)


EDIT (juin 2018):

Selon this , le rappel renvoie en réalité le client connecté de la base de données, au lieu de la base de données elle-même. 

Par conséquent, pour obtenir l'instance de base de données, nous devons utiliser cette méthode , qui prend une variable dbName. Dans la documentation, il est indiqué If not provided, use database name from connection string., comme indiqué par @divillysausages dans les commentaires ci-dessous.

En bref, nous devrions appeler database.db().collection('theCollectionIwantToAccess'); si dbName est fourni par url, où database est en réalité client pour une meilleure compréhension.

220
Jake Boomgaarden

L'erreur est dans la bibliothèque mongodb. Essayez d’installer la version 2.2.33 de mongodb. Supprimez votre répertoire node_modules et ajoutez 

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

Ensuite

npm install

et vous voilà

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

Il faut d'abord obtenir la base de données avant d'essayer d'accéder aux collections.

19
Shashi Kiran

Selon le document Mongo, nous devons changer la connexion ci-dessous,

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

Pas besoin de déclasser la version Mongo :)

12
Dilum Darshana

La désinstallation du paquet mongodb existant et la réinstallation à l'aide des commandes suivantes ont résolu les problèmes pour moi. :)

npm uninstall mongodb --save

npm install [email protected] --save

PS: Merci à @MihirBhende et @yaxartes

FYI,

Préférez les versions non-rc de https://github.com/mongodb/node-mongodb-native/releases , si vous êtes nouveau sur le terrain.

9
Naveen Kumar V

J'ai rencontré le même problème. Il semble que le module du pilote mongodb pour le noeud ait été mis à jour depuis la création de la vidéo. J'ai trouvé le code ci-dessous dans la documentation qui fonctionne. 

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

});  

est remplacé par 

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

    });  

Voici un link vers les derniers documents au cas où nous aurions des problèmes de syntaxe supplémentaires.

5
Pulkit Aggarwal
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 -> client

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) => {
...
1
Yong-bin Jeong

Si j'avais eu ce problème aussi, je suivais un tutoriel dans lequel le présentateur utilisait la collection en tant que fonction. Cela n'a jamais fonctionné pour moi. Ce que j’ai découvert, c’est que le présentateur utilisait la version 2.3.4 du module mongodb npm. le module est bien dans la version 3.x.x maintenant. Lorsque j'ai modifié le fichier package.json pour demander la version 2.x.x du module mogodb npm, tout a fonctionné. 

Ce que je croyais arrivé, c'est que le module a été modifié pour transformer la collection en un objet différent. Je ne sais pas comment utiliser la nouvelle version, mais si vous spécifiez que vous souhaitez utiliser la version 2.x.x, l'ancienne méthode devrait fonctionner. Plus précisément, je peux confirmer que (provenant de mon fichier package.json, section "dépendances") "mongodb": "^ 2.2.31" fonctionne.

Meilleur moyen: 

$> npm install [email protected] --save
0
PhiipT

Dans votre package.json.

assurez-vous que les versions suivantes ressemblent à ceci:

"nodemon": "^1.12.1"
"mongodb": "^2.2.33"

les versions précédentes de nodemon et de mongodb fonctionnent ensemble sans erreur .. donc votre package.json devrait ressembler à ceci:

    {
  "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"
  }
}

n'oubliez pas de lancer npm install après la mise à niveau

0
RileyManda

Merci beaucoup à Dilum Darshana! Vos conseils ont beaucoup aidé. Je veux juste ajouter que si vous utilisez des promesses, cela ressemblera à ceci:

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);
});
0
Alexandr Shmidt

Code de travail utilisant:

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"

Voici le code 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);
    });
})

Voici le code config/db.js:

module.exports = {
    url:"mongodb://127.0.0.1:27017"
}

Voici 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
Sanaullah Ahmad

Ne pas utiliser le nom de la base de données dans l'URL de connexion:

const mongo_url = 'mongodb://localhost:27017'

Utilisez plutôt la méthode ci-dessous:

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);
        });
    });
0
Ravi Jaisawal
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);

     });
   });
0
Tikaram Mardi

J'ai une solution simple:

note_routes.js

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

remplacer

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