69 votes

TypeError : db.collection n'est pas une fonction

J'essaie d'envoyer des données à 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 les questions posées précédemment sur ce sujet mais je ne suis pas en mesure de résoudre mon erreur car je suis nouveau dans ce domaine. J'ai également lu les questions posées précédemment sur ce sujet, mais je ne suis pas en mesure de résoudre mon erreur car je suis nouveau dans ce domaine. 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]);
      }
    });
  });
};

0 votes

Dans votre index.js, je ne vois pas où vous déclarez db - Vous en avez besoin ?

0 votes

Si vous voulez apprendre à utiliser mongoDB, vous pouvez télécharger NPM. Modèles Mongo . npmjs.com/package/mongo-models Grâce au beau paquet node, vous pouvez ouvrir les codes Mongo Models et apprendre à partir de là.

236voto

Jake Boomgaarden Points 2348

J'ai donc voté pour la réponse qui disait de simplement descendre à mongodb 2.2.33 parce que je l'ai essayé et que cela a fonctionné, mais ensuite je me suis senti bizarre à l'idée de simplement rétrograder pour résoudre un problème, alors j'ai trouvé la solution qui vous permet de garder la version >= 3.0. Si quelqu'un rencontre ce problème et que son problème n'était pas de passer dans une référence vide comme la réponse acceptée, essayez cette solution.

Quand tu cours

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

Dans la version mongodb >= 3.0, Que database est en fait l'objet parent de l'objet auquel vous essayez d'accéder avec la variable database.collection('whatever') . Pour accéder à l'objet correct, vous devez faire référence au nom de votre 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 a corrigé 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 mettre à niveau sa version.

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


EDIT (juin 2018) :

Selon este la fonction de rappel renvoie en fait 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 la base de données, nous devons utiliser cette méthode qui accueille un dbName . Dans la documentation, il est dit If not provided, use database name from connection string. comme le mentionne @divillysausages dans les commentaires ci-dessous.

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

0 votes

J'ai essayé la même chose mais la requête db.collection est appelée avant que database.db('dbname') ne donne l'objet db. et donc j'obtiens la même erreur.

0 votes

Bien que, database.db('dbname') donne un objet correct mais avant que la requête soit déjà exécutée donnant l'erreur

0 votes

Cela fonctionne comme un charme pour moi puisque le problème se produisait toujours même si j'ai rempli le paramètre de la base de données comme indiqué dans la réponse acceptée....

36voto

antikytheraton Points 496

L'erreur se situe dans la bibliothèque mongodb. Essayez d'installer la version 2.2.33 de mongodb . Supprimez votre node_modules

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

Puis

npm install

et vous voilà

1 votes

... incroyable que le problème vienne de la version de mongodb. mon package.json avait 3.0.0-rc0 installé par défaut par le biais de npm install mongodb --save belle prise @yaxartes

7 votes

DavidAnderton Le problème n'est pas lié à MongoDB, mais à la syntaxe. Voir ma solution ci-dessous si vous ne voulez pas downgrade mongodb, j'espère que cela vous aidera !

0 votes

@antikytheraton La rétrogradation n'est pas la meilleure solution, il faut le bon syntex.

23voto

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

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

15voto

Dilum Darshana Points 139

Selon le document de Mongo, nous devons changer la connexion comme 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');
});

Il n'est pas nécessaire de mettre à jour la version de mongo :)

0 votes

Donc, quelle que soit la profondeur de l'url que je passe, cela me donnera seulement le client, n'est-ce pas ?

12voto

Naveen Kumar V Points 469

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 mongodb@2.2.33 --save

PS : Merci à @MihirBhende et @yaxartes

FYI,

Préférer les versions non-rc de https://github.com/mongodb/node-mongodb-native/releases si vous êtes nouveau dans le domaine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X