node.js - nodejs - typeerror db query is not a function



TypeError: db.collection n'est pas une fonction (11)

Code de travail en 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])
                    }
                });

            });
        };

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 aussi lu une question déjà posée sur ce sujet, mais je ne parviens pas à résoudre mon erreur car 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]);
      }
    });
  });
};

Answer #1

Dans votre package.json.

assurez-vous que les versions suivantes ressemblent à ceci:

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

Les versions nodemon et mongodb ci-dessus 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 l' installation de npm après la rétrogradation


Answer #2

J'ai donc voté pour la réponse qui disait simplement descendre à mongodb 2.2.33 parce que je l'avais essayé et que ça marchait, mais ensuite je me sentais bizarre de simplement rétrograder pour résoudre un problème, j'ai donc trouvé la solution qui permet de conserver la version> = 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 de database est en fait l'objet parent de l'objet auquel vous tentez 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 dbName un nom de dbName . Dans la documentation, il est dit If not provided, use database name from connection string. , comme mentionné par @divillysausages dans les commentaires ci-dessous.

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


Answer #3

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 d'autres problèmes de syntaxe.


Answer #4

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

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

ensuite

npm install

et vous voilà


Answer #5

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].2.33 --save

PS: Merci à @MihirBhende et @yaxartes

Pour votre information,

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


Answer #6

Pour la version récente, j'utilisais "mongodb": "^3.1.3" code ci-dessous a résolu mon problème.

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

})

et votre code postal est comme

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

Answer #7

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 :)


Answer #8

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

Answer #9
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);

     });
   });

Answer #10
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.





express