TypeError: db.collection ist keine Funktion

69

Ich versuche, Daten in einer Datenbank zu veröffentlichen, die ich auf mLab erstellt habe, und es wird dieser Fehler angezeigt, aber ich weiß nicht, was falsch läuft. Ich habe auch zuvor gestellte Fragen zu diesem Thema gelesen, kann meinen Fehler jedoch nicht als beheben Ich bin neu in diesem Bereich. Hier veröffentliche ich 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-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]);
      }
    });
  });
};
Jay
quelle
In Ihrer index.js kann ich nicht sehen, wo Sie deklarieren db- benötigen Sie es?
Alex
Wenn Sie mongoDB lernen möchten, können Sie NPM Mongo Models herunterladen . npmjs.com/package/mongo-models Mit dem wunderschönen Knotenpaket können Sie Mongo Models-Codes öffnen und von dort lernen.
Titus Sutio Fanpula

Antworten:

9

In Ihrer Datei server.js übergeben Sie ein leeres Objekt, an das Sie die Datenbank als zweites Argument übergeben müssen, wie es Ihre Exportfunktion routen / index.js erwartet.

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

});
Mihir Bhende
quelle
Req.body.body und req.body.title geben mir beide 'undefind'. Sehen Sie etwas falsch daran?
Jay
Sie müssen app.use (bodyParser.json ()) hinzufügen. Middleware
Mihir Bhende
Der Titel stammt aus der Post oder ist es ein URL-Slug-Parameter?
Mihir Bhende
Nein. Wenn ich console.log (req.body) mache, gibt es mir Titel und Text, aber wenn ich console.log (req.body.body) mache, gibt es mir undefind.
Jay
Stellen Sie nur sicher, dass ich das richtig verstehe. Wenn Sie console.log (req.body) ausführen, erhalten Sie den Titel und den Text der Eigenschaften und dann versuchen Sie, req.body.title und req.body.body zu protokollieren. Können Sie bitte noch einmal überprüfen, ob dies Eigenschaften von req.body oder nur von req sind?
Mihir Bhende
235

Also habe ich für die Antwort gestimmt, die besagt, dass ich nur zu Mongodb 2.2.33 gehen soll, weil ich es ausprobiert habe und es funktioniert hat, aber dann fühlte ich mich komisch, nur ein Downgrade durchzuführen, um ein Problem zu beheben, also habe ich die Lösung gefunden, mit der Sie die Version> = behalten können 3.0. Wenn jemand dieses Problem findet und sein Problem nicht in einer leeren Referenz wie der akzeptierten Antwort übergeben wurde, probieren Sie diese Lösung aus.

Wenn du rennst ..

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

In der Mongodb-Version> = 3.0 ist diese databaseVariable tatsächlich das übergeordnete Objekt des Objekts, auf das Sie zugreifen möchten database.collection('whatever'). Um auf das richtige Objekt zugreifen zu können, müssen Sie Ihren Datenbanknamen referenzieren

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

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

(Wenn Sie Ihren Datenbanknamen aus irgendeinem Grund nicht kennen, erstellen Sie einfach eine console.log (Datenbank) und Sie sehen sie als Objektattribut.)


EDIT (Juni 2018):

Nach diesem kehrt der Rückruf tatsächlich den angeschlossenen Client aus der Datenbank, anstatt die Datenbank selbst.

Um die Datenbankinstanz zu erhalten, müssen wir daher diese Methode verwenden , die a akzeptiert dbName. In der Dokumentation heißt es If not provided, use database name from connection string., wie von @divillysausages in den Kommentaren unten erwähnt.

Kurz gesagt, wir sollten aufrufen, database.db().collection('theCollectionIwantToAccess');ob der Datenbankname über die URL bereitgestellt wird, wobei der Name databasetatsächlich clientzum besseren Verständnis dient

Jake Boomgaarden
quelle
Ich habe das Gleiche versucht, aber die Abfrage db.collection wird aufgerufen, bevor database.db ('dbname') das db-Objekt angibt. und damit den gleichen Fehler msg bekommen
Aman Gupta
Obwohl database.db ('dbname') das richtige Objekt angibt, wird die Abfrage zuvor bereits ausgeführt und gibt den Fehler aus
Aman Gupta
8
Hier ist eine Liste der wichtigsten Änderungen zwischen V2 und V3
Yoav
2
Ich bin irgendwie verblüfft, dass MongoDBs eigene Dokumente dies nicht einmal zeigen.
Brett84c
5
FYI, wenn die Verbindungszeichenfolge den DB - Namen enthält (zB mongodb://localhost:27107/MyDB, dann wird es als Standard für die zurück MongoClient eingestellt werden ( databasein diesem Beispiel) Auf diese Weise können Sie anrufen. database.db()Die tatsächliche DB zu bekommen
divillysausages
36

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

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

Dann

npm install

und da bist du

Antikytheraton
quelle
1
... unglaublich, dass das Problem mit der Version auf Mongodb ist. Mein package.json hatte 3.0.0-rc0 standardmäßig durch npm install mongodb --savegreat catch @yaxartes installiert
David
7
@DavidAnderton Das Problem liegt nicht bei MongoDB, sondern nur bei der Syntax. Siehe meine Lösung unten, wenn Sie Mongodb nicht herabstufen möchten, hoffe, es hilft!
Jake Boomgaarden
@antikytheraton Downgrade ist nicht die beste Lösung, brauchen die richtige Syntex
Ganesh
@ Ganesh Ich stimme dir zu. Diese Lösung war mein Weg, um dieses Problem zu lösen, als Mongo zu diesem Zeitpunkt direkt auf Version 3 aktualisiert wurde
Antikytheraton
23
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.

Shashi Kiran
quelle
15

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

Dilum Darshana
quelle
Wie tief ich die URL auch weitergebe, sie gibt mir nur einen Kunden. ist es nicht?
Shubham Agarwal Bhewanewala
12

Das Deinstallieren des vorhandenen Mongodb-Pakets und die Neuinstallation mit den folgenden Befehlen haben die Probleme für mich behoben. :) :)

npm uninstall mongodb --save

npm install mongodb@2.2.33 --save

PS: Danke an @MihirBhende und @yaxartes

Zu Ihrer Information,

Bevorzugen Sie Nicht-RC-Releases von https://github.com/mongodb/node-mongodb-native/releases , wenn Sie neu auf dem Gebiet sind.

Naveen Kumar V.
quelle
8

Ich bin auf dasselbe Problem gestoßen. Es sieht so aus, als ob das Mongodb-Treibermodul für den Knoten seit der Erstellung des Videos aktualisiert wurde. 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 ersetzt durch

 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 wir auf weitere Syntaxprobleme stoßen.

Pulkit Aggarwal
quelle
4

Für die aktuelle Version, die ich verwendet habe, hat der folgende "mongodb": "^3.1.3"Code 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 deine 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])
            }
        });
    });
};
Krish
quelle
3
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) => {
...
Yong-bin Jeong
quelle
3

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

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);
});
Alexandr Shmidt
quelle
Sollte die URL den Sammlungsnamen enthalten? Ich schaue auf mongodb.github.io/node-mongodb-native/driver-articles/… und es scheint nicht, dass das URL-Format dies unterstützt, es sei denn, Ihre Datenbank und Sammlung haben den gleichen Namen?
Arman
Ich denke ja, weil Sie das bestimmte Objekt für Ihre Ziele nehmen müssen und das bestimmte Objekt sowieso Teil einer bestimmten Sammlung ist, die Teil der Datenbank ist. Natürlich, wenn ich Ihre Frage richtig verstanden habe.
Alexandr Shmidt
1

In Ihrer package.json.

Stellen Sie sicher, dass die folgenden Versionen folgendermaßen aussehen:

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

Die oben genannten Versionen von nodemon und mongodb arbeiten fehlerfrei zusammen. Ihre package.json sollte also ungefähr 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

RileyManda
quelle
1

Hatte auch dieses Problem, folgte ich einem Tutorial, in dem der Moderator die Sammlung als Funktion verwendete. Bei mir hat es nie funktioniert. Was ich entdeckte, war, dass der Moderator Version 2.3.4 des mongodb npm-Moduls verwendete. Das Modul ist jetzt weit in Version 3.xx. Als ich die Datei package.json änderte, um die 2.xx-Version des mogodb npm-Moduls anzufordern, funktionierte plötzlich alles.

Was ich glaubte, war, dass das Modul geändert wurde, um die Sammlung in ein anderes Objekt zu ändern. Ich weiß nicht, wie ich die neue Version verwenden soll, aber wenn Sie angeben, dass Sie die 2.xx-Version möchten, sollte die alte Methode funktionieren. Insbesondere kann ich bestätigen, dass (aus meiner package.json-Datei, Abschnitt "Abhängigkeiten") "mongodb": "^ 2.2.31" funktioniert.

Bester Weg:

$> npm install mongodb@2.2.31 --save
PhiipT
quelle
1
MongoClient.connect(db.url,(err,database) =>{
    if (err) return console.log(err)
    //require('./app/routes')(app,{});
    //try this 
     require('./app/routes')(app,database);
    app.listen(port,() => {
        console.log("We are live on"+port); 
    });
})

Hier müssen Sie die Datenbank in das leere {} aufnehmen.

oder

Sie können auch versuchen, mongodb auf dem neuesten Stand zu installieren, um das Problem zu beheben.

npm install mongodb@2.2.33 --save 

sonst npm install add Abhängigkeit von "mongodb": "^ 2.2.33" in Knotenmodulen.

Shashidhar Reddy
quelle
0

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.jsCode:

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.jsCode:

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

            });
        };
Sanaullah Ahmad
quelle
0

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);
        });
    });
Ravi Jaisawal
quelle
Bitte fügen Sie der Antwort mehr hinzu, die erklärt, warum das OP Ihren Code verwenden sollte und wie es das Problem löst!
MBT
0
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);

     });
   });
Tikaram Mardi
quelle
0

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) => {
Dmitrii Dubrovin
quelle
0

Ich mache das gleiche Tutorial mit dem gleichen Problem. Ich habe gerade alle Antworten überprüft und die für mich gefunden.

MongoClient.connect(db.url, { useUnifiedTopology: true }, (err, client) => {
var database = client.db('test');
if (err) return console.log(err) 
require('./app/routes')(app, database);
app.listen(port, () => { console.log('We are live on ' + port);}); })

Datenbank in Client geändert und Datenbank als client.db definiert ('test')


quelle