it-swarm.com.de

TypeError: db.collection ist keine Funktion

Ich versuche, Daten in einer Datenbank zu veröffentlichen, die ich auf mLab erstellt habe, und ich bekomme diesen Fehler. Ich weiß jedoch nicht, was schief läuft Ich bin neu in diesem Bereich. Also poste ich hier den Code, den ich implementieren möchte und er stammt aus diesem Tutorial https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30- Minuten-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

In Ihrer server.js übergeben Sie ein leeres Objekt, bei dem Sie die Datenbank als zweites Argument übergeben müssen, wie es die Exportfunktion von routes/index.js erwartet.

PFB aktualisierte 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

Also habe ich für die Antwort gestimmt, die besagte, ich solle einfach auf mongodb 2.2.33 runtergehen, weil ich es ausprobiert habe und es hat funktioniert, aber dann kam es mir seltsam vor, ein Downgrade durchzuführen, um ein Problem zu beheben, also habe ich die Lösung gefunden, die es Ihnen ermöglicht, Version> = 3,0. Wenn jemand dieses Problem findet und sein Problem keine leere Referenz wie die akzeptierte Antwort enthielt, probieren Sie diese Lösung aus.

Wenn du rennst ..

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

In der mongodb-Version> = 3.0 ist diese Variable database tatsächlich das übergeordnete Objekt des Objekts, auf das Sie mit database.collection('whatever') zugreifen möchten. Um auf das richtige Objekt zuzugreifen, müssen Sie auf Ihren Datenbanknamen verweisen

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

Dies behebte meine Fehler beim Ausführen meines node.js-Servers. Hoffentlich hilft dies jemandem, der nicht nur seine Version herunterstufen möchte.

(Wenn Sie Ihren Datenbanknamen aus irgendeinem Grund nicht kennen, führen Sie einfach eine Konsole.log (Datenbank) aus, und Sie werden sie als Objektattribut sehen.)


EDIT (Juni 2018):

Gemäß this gibt der Rückruf tatsächlich den verbundenen Client der Datenbank statt der Datenbank selbst zurück. 

Um die Datenbankinstanz zu erhalten, müssen wir diese Methode verwenden, die ein dbName enthält. In der Dokumentation stand If not provided, use database name from connection string., wie von @divillysausages in den Kommentaren erwähnt.

Kurz gesagt, sollten wir database.db().collection('theCollectionIwantToAccess'); aufrufen, wenn der Datenbankname von url angegeben wird, wobei database tatsächlich client ist, um das Verständnis zu erleichtern

220

Der Fehler befindet sich in der Mongodb-Bibliothek. Versuchen Sie, die Version 2.2.33 von mongodb zu installieren. Löschen Sie Ihr node_modules-Verzeichnis und fügen Sie hinzu 

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

Dann

npm install

und da bist du

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

Sie müssen zuerst die Datenbank abrufen, bevor Sie versuchen, auf die Sammlungen zuzugreifen.

19
Shashi Kiran

Laut dem Mongo-Dokument müssen wir die Verbindung wie folgt ändern:

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

Die Mongo-Version muss nicht heruntergestuft werden :)

12
Dilum Darshana

Durch die Deinstallation des vorhandenen mongodb-Pakets und die Neuinstallation mit den folgenden Befehlen wurden die Probleme behoben. :)

npm uninstall mongodb --save

npm install [email protected] --save

PS: Danke an @MihirBhende und @yaxartes

FYI,

Bevorzugen Sie Nicht-RC-Releases von https://github.com/mongodb/node-mongodb-native/releases , wenn Sie noch nicht mit dem Feld vertraut sind.

9
Naveen Kumar V

Ich bin auf die gleiche Ausgabe gestoßen. Das mongodb-Treibermodul für den Knoten wurde seit der Erstellung des Videos aktualisiert. Ich habe den folgenden Code in den Dokumenten gefunden, der funktioniert. 

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

});  

wird durch ersetzt 

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

    });  

Hier ist ein link zu den neuesten Dokumenten, falls weitere Syntaxprobleme auftreten.

5
Pulkit Aggarwal

In der letzten Version habe ich "mongodb": "^3.1.3" Der folgende Code hat mein Problem gelöst

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

})

und Ihre Postleitzahl ist wie

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

Hatte dieses Problem auch, folgte ich einem Tutorial, in dem der Moderator die Sammlung als Funktion verwendete. Es hat nie für mich funktioniert. Was ich entdeckte, war, dass der Moderator Version 2.3.4 des mongodb-npm-Moduls verwendete. Das Modul ist jetzt in Version 3.x.x. Als ich die package.json-Datei geändert habe, um die 2.x.x-Version des mogodb-npm-Moduls anzufordern, funktionierte plötzlich alles. 

Ich glaubte, dass das Modul geändert wurde, um die Sammlung in ein anderes Objekt umzuwandeln. Sie können die neue Version nicht verwenden, aber wenn Sie angeben, dass Sie die 2.x.x-Version verwenden möchten, sollte die alte Version funktionieren. Konkret kann ich bestätigen, dass "mongodb" (aus meiner package.json-Datei, Abschnitt "Abhängigkeiten") "^ 2.2.31" funktioniert.

Bester Weg: 

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

In Ihrem package.json.

stellen Sie sicher, dass die folgenden Versionen so aussehen:

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

die obigen Versionen von nodemon und mongodb arbeiten ohne Fehler zusammen Ihr package.json sollte daher etwa so aussehen:

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

vergessen Sie nicht, npm install nach dem Downgrade auszuführen

0
RileyManda

Vielen Dank an Dilum Darshana! Dein Rat hat sehr geholfen. Ich möchte nur hinzufügen, dass, wenn Sie Versprechen verwenden, es so aussehen wird:

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

Arbeitscode mit:

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"

Hier ist server.js code:

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

Hier ist config/db.js code:

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

Hier ist 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

Verwenden Sie den Datenbanknamen nicht in der Verbindungs-URL:

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

Verwenden Sie stattdessen die folgende Methode:

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

Ich habe eine einfache Lösung:

note_routes.js

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

ersetzen

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