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

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

});

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


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


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.


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


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.


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.


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

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) => {
...

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

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


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

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.


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

            });
        };

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

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: 'helloworld@test.com'

  },(err,result)=> {
  if(err) {
      return console.dir(err)
  }
  console.log("Inserted Document");
  console.log(result);

     });
   });

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) => {

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.