with one not nodejs node createcollection collection async node.js mongodb rest express

node.js - one - TypeError: db.collection no es una función



node js model find (16)

Estoy tratando de publicar datos en la base de datos que he creado en mLab y recibo este error, pero no sé qué va mal. También he leído la pregunta anterior sobre este tema, pero no puedo resolver mi error como 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 .

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


¡Muchas gracias a Dilum Darshana! Tu consejo me ayudó mucho. Solo quiero agregar que, si usas 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); });


Así que voté por la respuesta que decía simplemente bajar a mongodb 2.2.33 porque lo probé y funcionó, pero luego me sentí raro por solo degradar 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 corres ..

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

En la versión mongodb> = 3.0, esa variable de database es en realidad el objeto padre del objeto al que está intentando acceder con database.collection(''whatever'') . Para acceder al objeto correcto, debe hacer referencia al nombre de su 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 servidor node.js, espero que esto ayude a alguien que no solo quiere degradar su versión.

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

EDITAR (junio de 2018):

De acuerdo con this , la devolución de llamada en realidad devuelve el cliente conectado de la base de datos, en lugar de la base de datos en sí.

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 lo menciona @divillysausages en los comentarios a continuación.

En resumen, deberíamos llamar a database.db().collection(''theCollectionIwantToAccess''); si la URL proporciona el nombre de db, donde la database es realmente client para una mejor comprensión


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á el código 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); }); })

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

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



El error está en la biblioteca mongodb. Intente instalar la versión 2.2.33 de mongodb . Elimine su directorio node_modules y agregue

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

Entonces

npm install

y ahí estás


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

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


En tu package.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 ningún error. entonces su package.json debería verse más o menos así:

{ "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 olvide ejecutar npm install después de degradar


Me encontré con el mismo problema. Parece que el módulo del controlador mongodb para el nodo se actualizó desde que se creó el video. Encontré el código a continuación 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 reemplaza con

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 link a los últimos documentos en caso de que tengamos más problemas de sintaxis.


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

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

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


Según el documento de mongo, necesitamos cambiar la conexión como se indica 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 :)


También tuve este problema, estaba siguiendo un tutorial en el que el presentador estaba usando la colección como una función. Nunca funciono para mi. 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.xx ahora. Cuando cambié el archivo package.json para solicitar la versión 2.xx del módulo mogodb npm, de repente todo funcionó.

Lo que creí que sucedió fue que el módulo fue alterado para cambiar la colección a un objeto diferente. No sé cómo usar la nueva versión, pero si especifica que desea la versión 2.xx, la forma anterior debería funcionar. Específicamente puedo confirmar que (proveniente de mi archivo package.json, sección "dependencias") "mongodb": "^ 2.2.31" funciona.

Mejor manera:

$> npm install [email protected] --save


Tengo una solución simple:

note_routes.js

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

reemplazar

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


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


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


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


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

Primero debe obtener la base de datos antes de intentar acceder a las colecciones.