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])
}
});
});
};
Desinstalar el paquete mongodb existente y reinstalar usando los siguientes comandos resolvió los problemas por mí. :)
npm uninstall mongodb --save
npm install [email protected] --save
PD: Gracias a @MihirBhende y @yaxartes
FYI
Prefiere lanzamientos que no sean rc de https://github.com/mongodb/node-mongodb-native/releases , si eres nuevo en el campo.
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.