166 votes

db.collection n'est pas une fonction lors de l'utilisation de MongoClient v3.0

J'ai essayé Tutoriel W3schools sur nodeJS avec MongoDB.

Lorsque j'essaie de mettre en œuvre cet exemple dans un environnement nodeJS et d'invoquer la fonction avec un appel AJAX, j'obtiens l'erreur ci-dessous :

TypeError: db.collection is not a function
    at c:\Users\user\Desktop\Web Project\WebService.JS:79:14
    at args.push (c:\Users\user\node_modules\mongodb\lib\utils.js:431:72)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:254:5
    at connectCallback (c:\Users\user\node_modules\mongodb\lib\mongo_client.js:933:5)
    at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:794:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

Veuillez trouver ci-dessous le code que j'ai implémenté :

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mytestingdb";

MongoClient.connect(url, function(err, db) {
  if (err) throw err;
  db.collection("customers").findOne({}, function(err, result) {
    if (err) throw err;
    console.log(result.name);
    db.close();
  });
});

Notez que l'erreur se produit chaque fois que l'exécution frappe :

db.collection("customers").findOne({}, function(err, result) {}

Notez également (au cas où cela aurait de l'importance) que j'ai installé le dernier paquet MongoDB pour node JS ( npm install mongodb ), et la version de MongoDB est MongoDB Enterprise 3.4.4, avec le pilote MongoDB Node.js v3.0.0-rc0.

1 votes

Avez-vous vérifié : (1) la base de données fonctionne (étant donné qu'il n'y a pas eu d'erreur, je suppose que oui) ; (2) la base de données mytestingdb existe (essayez d'utiliser robomongo/robo3t pour accéder à votre connexion et voir les collections) (3) la collection customers existe réellement ; Dites-nous également comment vous appelez ce script et quelle version de Nodejs (comment l'avez-vous installé ?)

0 votes

La base de données et la collection existent (j'y ai accédé en utilisant Studio 3t). Je débogue nodeJS en appelant la méthode par le biais d'un appel AJAX, en fait les points d'arrêt sont atteints et tout fonctionne bien jusqu'à ce que j'obtienne l'exception mentionnée ci-dessus. La version de NodeJS est v6.11.4.

0 votes

Ensuite, remplacez le code qui commence par db.collection()... avec un journal de la console pour voir s'il y arrive, pas de problème.

541voto

MikaS Points 6044

Pour les personnes utilisant la version 3.0 du pilote NodeJS natif de MongoDB :

(Ceci est applicable aux personnes avec "mongodb" : "^3.0.0-rc0", ou une version ultérieure dans package.json, qui veulent continuer à utiliser la dernière version).

Dans la version 2.x de l Pilote MongoDB natif NodeJS vous obtiendriez l'objet de la base de données comme argument pour le callback de connexion :

MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
  // Database returned
});

Selon le journal des modifications pour 3.0, vous obtenez maintenant un objet client contenant l'objet base de données à la place :

MongoClient.connect('mongodb://localhost:27017', (err, client) => {
  // Client returned
  var db = client.db('mytestingdb');
});

Le site close() a également été déplacée vers le client. Le code de la question peut donc être traduit en :

MongoClient.connect('mongodb://localhost', function (err, client) {
  if (err) throw err;

  var db = client.db('mytestingdb');

  db.collection('customers').findOne({}, function (findErr, result) {
    if (findErr) throw findErr;
    console.log(result.name);
    client.close();
  });
});

1 votes

Maintenant, devons-nous écrire ceci ( var db = client.db('mytestingdb'); ) à chaque fois au lieu d'écrire simplement comme ceci ( MongoClient.connect('mongodb://localhost:27017/mytestingdb'‌​) ) ? Je travaille toujours avec la même base de données. Existe-t-il un moyen d'éliminer cette ligne supplémentaire ? C'est un peu une perte de temps pour moi.

8 votes

@ozgrozer Il me semble que vous vous connectez à la base de données pour chaque requête. C'est considéré comme une mauvaise idée. Vous pouvez lire à ce sujet ici . Si vous ne vous connectez qu'une fois, il n'y a qu'une seule nouvelle ligne par application que vous créez.

1 votes

@MikaS Oh oui. Je me connectais à la base de données comme vous l'avez dit. Je ne savais pas qu'on pouvait se connecter une fois et réutiliser la variable db. Merci beaucoup.

81voto

AyoO Points 992

J'ai rencontré la même chose. Dans package.json, changez la ligne mongodb en "mongodb" : "^2.2.33". Vous devrez désinstaller mongodb npm en supprimant MongoDB Driver/ node_modules ou etc , puis installer npm pour installer cette version.

Cela a résolu le problème pour moi. Il semble que ce soit un bug ou que la documentation doive être mise à jour.

16 votes

Voir la réponse de MikaS

85 votes

La mise à niveau vers une version antérieure n'est pas vraiment une solution, cela signifie simplement que vous n'avez pas pris la peine d'examiner les changements d'API qui ont causé ce problème.

3 votes

JohnCulviner - C'était un problème de timing, pas un problème de paresse. Ce problème s'est produit alors qu'ils étaient en train de publier la nouvelle mise à jour. Je (et l'auteur de la première affiche) ne l'ai évidemment pas réalisé. À ce moment-là, les documents n'étaient pas encore mis à jour. Ils ont été mis à jour peu de temps après. Toute personne cherchant à résoudre ce problème dès maintenant devrait suivre le commentaire de MikaS et consulter les documents mis à jour J'ai fait de même après la mise à jour de la documentation et j'ai pu continuer avec la version mise à jour.

43voto

raiglstorfer Points 1118

Pour ceux qui veulent continuer à utiliser la version ^3.0.1, soyez conscients des changements apportés à l'utilisation de l'outil de gestion de l'information. MongoClient.connect() méthode. Le callback ne retourne pas db au lieu de cela, il renvoie client contre laquelle il existe une fonction appelée db(dbname) que vous devez invoquer pour obtenir le db instance que vous recherchez.

const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');

// Connection URL
const url = 'mongodb://localhost:27017';

// Database Name
const dbName = 'myproject';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  const db = client.db(dbName);

  client.close();
});

2 votes

Cette réponse est plus récente et s'applique à la version 3 du pilote. Merci

1 votes

Je recommande cette solution, elle est plus appropriée pour une référence future.

39voto

Dre Jackson Points 343
MongoClient.connect(url (err, client) => {
    if(err) throw err;

    let database = client.db('databaseName');

    database.collection('name').find()
    .toArray((err, results) => {
        if(err) throw err;

        results.forEach((value)=>{
            console.log(value.name);
        });
    })
})

Le seul problème avec votre code est que vous accédez à l'objet qui contient le gestionnaire de base de données. Vous devez accéder directement à la base de données (voir la variable database ci-dessus). Ce code renverra votre base de données dans un tableau et ensuite il bouclera à travers elle et enregistrera le nom de chaque personne dans la base de données.

0 votes

Cette réponse est marquée comme étant de faible qualité en raison de sa longueur et de son contenu. Veuillez fournir plus d'informations.

0 votes

C'est seulement aussi long que nécessaire. Cette réponse m'a aidé.

1 votes

@ManuelHernandez content que cela ait aidé :)

14voto

agarcian Points 2043

En s'appuyant sur la réponse de @MikkaS pour Mongo Client v3.x, j'avais juste besoin du format async / await, qui se présente sous la forme légèrement modifiée suivante :

const myFunc = async () => {

     // Prepping here...

    // Connect
    let client = await MongoClient.connect('mongodb://localhost');
    let db = await client.db();

    // Run the query
    let cursor = await db.collection('customers').find({});

    // Do whatever you want on the result.
}

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