TypeError: db.la colección no es una función


Estoy tratando de publicar datos en la base de datos que he creado en mLab y estoy recibiendo este error, pero no se lo que va mal.También he leído la pregunta formulada anteriormente sobre este tema, pero no soy capaz de resolver mi error, ya que soy nuevo en esto. Así que aquí estoy publicando el código que estoy tratando de implementar y está tomado de este tutorial https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30-minutes-a07ea9e390d2.

Servidor.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"
};

Índice.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]);
      }
    });
  });
};
Author: Jay Tanna, 2017-05-04

14 answers

En su servidor.js, está pasando un objeto vacío donde necesita pasar la base de datos como segundo argumento ya que es lo que sus rutas/índice.la función de exportación js espera.

Servidor PFB actualizado.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); 
    });

});
 6
Author: Mihir Bhende,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-26 13:48:25

Así que voté por la respuesta que decía que simplemente bajara a mongodb 2.2.33 porque lo intenté y funcionó, pero luego me sentí raro por solo bajar de categoría para solucionar un problema, así que encontré la solución que te permite mantener la versión >= 3.0. Si alguien encuentra este problema y su problema no estaba pasando una referencia en blanco como la respuesta aceptada, pruebe esta solución.

Cuando corras..

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

En la versión de mongodb >= 3.0, esa variable database es en realidad el objeto padre de la objeto al que está intentando acceder con database.collection('whatever'). Para acceder al objeto correcto, necesita hacer referencia a su nombre de base de datos, para mí eso fue haciendo

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

Esto solucionó mis errores al ejecutar mi nodo.servidor js, espero que esto ayude a alguien que no solo quiere degradar su versión.

(también, si no conoce el nombre de su base de datos por alguna razón, simplemente haga una consola.log (base de datos) y lo verás como un atributo de objeto)


EDITAR (junio de 2018):

De acuerdo con este, la devolución de llamada realmente devuelve el cliente conectado de la base de datos, en lugar de la propia base de datos.

Por lo tanto, para obtener la instancia de la base de datos, necesitamos usar este método, que toma un dbName. En la documentación decía If not provided, use database name from connection string., como menciona @divillysausages en los comentarios a continuación.

En resumen, deberíamos llamar a database.db().collection('theCollectionIwantToAccess'); si el dbName es proporcionado por url, donde database es en realidad client para comprender mejor

 201
Author: Jake Boomgaarden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 07:30:18

El error está en la biblioteca mongodb. Intente instalar la versión 2.2.33 de mongodb. Elimina tu directorio node_modules y añade

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

Entonces

npm install

Y ahí estás

 32
Author: antikytheraton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-19 08:13:47
MongoClient.connect(uristring, function (err, database) {
      var db=database.db('chatroomApp');
      var collections=db.collection('chats');
});

Necesita obtener la Base de datos primero antes de intentar acceder a las colecciones.

 18
Author: Shashi Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-05 19:37:34

De acuerdo con el documento mongo, necesitamos cambiar la conexión como a continuación,

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

No es necesario degradar la versión de mongo:)

 10
Author: Dilum Darshana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 03:24:47

Desinstalar el paquete mongodb existente y reinstalarlo usando los siguientes comandos me resolvió los problemas. :)

npm uninstall mongodb --save

npm install [email protected] --save

PD: Gracias a @MihirBhende y @yaxartes

FYI,

Prefieren las liberaciones no rc de https://github.com/mongodb/node-mongodb-native/releases , si eres nuevo en el campo.

 8
Author: Naveen Kumar V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-13 11:13:16

Me encontré con el mismo problema. Parece que el módulo de controlador mongodb para nodo se actualizó desde que se creó el video. Encontré el siguiente código en los documentos que funciona.

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

});  

Se sustituye por

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

    });  

Aquí hay un enlace a los últimos documentos en caso de que nos encontremos con más problemas de sintaxis.

 4
Author: Pulkit Aggarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-21 17:35:13
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 - > cliente

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
Author: Yong-bin Jeong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 10:22:30

En su paquete.json.

Asegúrese de que las siguientes versiones se vean así:

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

Las versiones anteriores de nodemon y mongodb funcionan juntas sin errores. así que tu paquete.json debería verse algo como esto:

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

No olvides ejecutar npm install después de degradar

 0
Author: RileyManda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 18:42:31

También tenía este problema, estaba siguiendo un tutorial en el que el presentador estaba usando la colección como una función. Nunca funcionó para mí. Lo que descubrí fue que el presentador estaba usando la versión 2.3.4 del módulo mongodb npm. el módulo está bien en la versión 3.x.x ahora. Cuando cambié el paquete.archivo json para solicitar el 2.versión x. x del módulo mogodb npm, de repente todo funcionó.

Lo que creo que pasó fue que el módulo fue alterado para cambiar la colección en un objeto diferente. No sé cómo utilizar la nueva versión, pero si especifica que desea el 2.x. x versión, la forma antigua debe funcionar. Específicamente puedo confirmar que (viniendo de mi paquete.archivo json, sección" dependencias")" mongodb":" ^2.2.31 " funciona.

La mejor manera:

$> npm install [email protected] --save
 0
Author: PhiipT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 00:02:06

Código de trabajo usando:

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"

Aquí está server.js código:

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

Aquí está config/db.js código:

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

Aquí está 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
Author: Sanaullah Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-18 12:01:50

Muchas gracias a Dilum Darshana! Tu consejo ayudó mucho. Solo quiero añadir, que, si utiliza promesas se verá así:

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
Author: Alexandr Shmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-27 20:31:26

Para la versión reciente que estaba usando "mongodb": "^3.1.3" El siguiente código resolvió mi problema

{[4] {} En[3]}
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);
    })

})

Y su código postal es como

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])
            }
        });
    });
};
 0
Author: Krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-14 01:55:01

No utilice el nombre de la base de datos en la url de conexión:

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

En su lugar, utilice el siguiente método:

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
Author: Ravi Jaisawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 08:06:39