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