TypeError: db.collection não é uma function

Eu estou tentando postar dados para database que eu criei no mLab e estou recebendo esse erro, mas eu não sei o que está errado. Eu também li a pergunta feita anteriormente sobre este tópico, mas eu não sou capaz de resolver o meu erro como Eu sou novo nisso. Então, aqui estou postando o código que estou tentando implementar e é retirado deste 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]); } }); }); }; 

Em seu server.js, você está passando o object vazio para o qual você precisa passar o database como segundo argumento, o que sua function de exportação routes / index.js espera.

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

Então eu votei na resposta que dizia apenas baixar para o mongodb 2.2.33 porque eu tentei e funcionou, mas então eu me senti estranho em apenas desclassificar para consertar um problema, então eu encontrei a solução que permite que você mantenha a versão> = 3.0. Se alguém encontrar esse problema e o problema não estiver passando em uma referência em branco como a resposta aceita, tente essa solução.

Quando você corre ..

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

Na versão mongodb> = 3.0, essa variável de database é, na verdade, o object pai do object que você está tentando acessar com database.collection('whatever') . Para acessar o object correto, você precisa referenciar o nome do seu database, para mim que estava fazendo

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

Isso corrigiu meus erros ao executar meu servidor node.js, espero que isso ajude alguém que não quer apenas fazer o downgrade de sua versão.

(também, se você não sabe o nome do seu database por algum motivo, basta fazer um console.log (database) e você o verá como um atributo de object)


EDIT (junho de 2018):

De acordo com isso , o retorno de chamada realmente retorna o cliente conectado do database, em vez do próprio database.

Portanto, para obter a instância do database, precisamos usar esse método , que aceita um dbName . Na documentação que disse If not provided, use database name from connection string. , como mencionado por @divillysausages nos comentários abaixo.

Em suma, devemos chamar database.db().collection('theCollectionIwantToAccess'); se o dbName é fornecido pelo url, onde o database é realmente client para melhor compreensão

O erro está na biblioteca mongodb. Tente instalar a versão 2.2.33 do mongodb . Exclua seu diretório node_modules e adicione

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

Então

 npm install 

e ai está você

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

Precisa obter o database antes de tentar acessar as collections.

De acordo com o documento mongo, precisamos mudar a conexão como abaixo:

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

Não precisa rebaixar a versão do mongo 🙂

Desinstalar o pacote mongodb existente e reinstalar usando os seguintes comandos resolveu os problemas para mim. 🙂

 npm uninstall mongodb --save npm install mongodb@2.2.33 --save 

PS: Graças a @MihirBhende e @yaxartes

PARA SUA INFORMAÇÃO,

Prefira versões não-rc de https://github.com/mongodb/node-mongodb-native/releases , se você for novo no campo.

Eu tive o mesmo problema. Parece que o módulo do driver mongodb para o nó foi atualizado desde que o vídeo foi criado. Eu encontrei o código abaixo nos documentos que funciona.

 var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/'; MongoClient.connect(url, (err, db) => { db.collection('').find({}).toArray(function(err, docs) { // Print the documents returned docs.forEach(function(doc) { console.log(doc); }); // Close the DB db.close(); }); }); 

é substituído 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('').find({}).toArray(function(err, docs) { // Print the documents returned docs.forEach(function(doc) { console.log(doc); }); // Close the DB client.close(); }); }); 

Aqui está um link para os documentos mais recentes, caso encontremos mais problemas de syntax.

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

Em seu pacote.json.

Verifique se as seguintes versões são assim:

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

as versões nodemon e mongodb acima funcionam juntas sem nenhum erro. então seu pacote.json deve ser parecido com isto:

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

não se esqueça de executar o npm install após o downgrade

Tive esse problema também, eu estava seguindo um tutorial em que o apresentador estava usando a coleção como uma function. Nunca funcionou comigo. O que eu descobri foi que o apresentador estava usando a versão 2.3.4 do módulo mongodb npm. o módulo está bem na versão 3.xx agora. Quando mudei o arquivo package.json para solicitar a versão 2.xx do módulo mogodb npm, de repente tudo funcionou.

O que eu acreditava que aconteceu foi que o módulo foi alterado para alterar a coleção em um object diferente. Não sei como usar a nova versão, mas se você especificar que deseja a versão 2.xx, o modo antigo deve funcionar. Especificamente, posso confirmar que (vindo do meu arquivo package.json, seção “dependencies”) “mongodb”: “^ 2.2.31” funciona.

Melhor maneira:

 $> npm install mongodb@2.2.31 --save 

Código de trabalho 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" 

Aqui está o 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); }); }) 

Aqui está o código config/db.js :

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

Aqui está o 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]) } }); }); }; 

Muito obrigado a Dilum Darshana! Seu conselho ajudou muito. Eu só quero acrescentar que, se você usar promises, será assim:

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

Para a versão recente eu estava usando "mongodb": "^3.1.3" Abaixo código resolvido meu problema

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

e seu código postal é 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]) } }); }); };