He estado intentando el tutorial de W3schools en nodeJS con MongoDB.
Cuando intento implementar este ejemplo en un entorno nodeJS e invocar la función con una llamada AJAX, recibí el siguiente error:
TypeError: db.collection is not a function
at c:\Users\user\Desktop\Web Project\WebService.JS:79:14
at args.push (c:\Users\user\node_modules\mongodb\lib\utils.js:431:72)
at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:254:5
at connectCallback (c:\Users\user\node_modules\mongodb\lib\mongo_client.js:933:5)
at c:\Users\user\node_modules\mongodb\lib\mongo_client.js:794:11
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
A continuación encontrará mi código implementado:
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mytestingdb";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
db.collection("customers").findOne({}, function(err, result) {
if (err) throw err;
console.log(result.name);
db.close();
});
});
Tenga en cuenta que el error ocurre cada vez que la ejecución golpea:
db.collection("customers").findOne({}, function(err, result) {}
Además, tenga en cuenta (en caso de que sea importante) que he instalado el último paquete de MongoDB para el nodo JS ( npm install mongodb ), y la versión de MongoDB es MongoDB Enterprise 3.4.4, con el controlador MongoDB Node.js v3.0.0-rc0.
db.collection()...
un registro de consola para ver si llega allí, no hay problema.Respuestas:
Encontré lo mismo. En package.json, cambie la línea mongodb a "mongodb": "^ 2.2.33". Deberá desinstalar npm mongodb; luego npm install para instalar esta versión.
Esto resolvió el problema para mí. Parece ser un error o los documentos deben actualizarse.
fuente
Para las personas en la versión 3.0 del controlador NodeJS nativo de MongoDB:
(Esto es aplicable a personas con "mongodb": "^ 3.0.0-rc0", o una versión posterior en package.json, que quieran seguir usando la última versión).
En la versión 2.x del controlador NodeJS nativo de MongoDB , obtendría el objeto de la base de datos como argumento para la devolución de llamada de conexión:
De acuerdo con el registro de cambios para 3.0, ahora obtiene un objeto de cliente que contiene el objeto de la base de datos:
El
close()
método también se ha trasladado al cliente. Por lo tanto, el código en la pregunta se puede traducir a:fuente
var db = client.db('mytestingdb');
línea adicional ( ) cada vez en lugar de simplemente escribir así (MongoClient.connect('mongodb://localhost:27017/mytestingdb')
)? Siempre estoy trabajando con la misma base de datos. ¿Hay algún enfoque para eliminar esa línea extra? Para mí es algo que consume mucho tiempo.Para aquellos que desean continuar usando la versión ^ 3.0.1, tenga en cuenta los cambios en la forma en que usa el
MongoClient.connect()
método. La devolución de llamada nodb
regresaclient
, en cambio, regresa , contra lo cual hay una función llamadadb(dbname)
que debe invocar para obtener ladb
instancia que está buscando.fuente
El único problema con su código es que está accediendo al objeto que contiene el manejador de la base de datos. Debe acceder a la base de datos directamente (consulte la variable de base de datos anterior). Este código devolverá su base de datos en una matriz y luego la recorre y registra el nombre de todos en la base de datos.
fuente
Respaldo en la respuesta @MikkaS para Mongo Client v3.x, solo necesitaba el formato asíncrono / espera, que se ve ligeramente modificado como este:
fuente
Experimenté un poco para ver si podía mantener el nombre de la base de datos como parte de la URL. Prefiero la sintaxis de promesa, pero aún debería funcionar para la sintaxis de devolución de llamada. Observe a continuación que se llama a client.db () sin pasar ningún parámetro.
Mi package.json enumera monbodb ^ 3.2.5.
La opción 'useNewUrlParser' no es necesaria si está dispuesto a lidiar con una advertencia de desaprobación. Pero es aconsejable usar en este punto hasta que salga la versión 4, donde presumiblemente el nuevo controlador será el predeterminado y ya no necesitará la opción.
fuente
Lo resolví fácilmente ejecutando estos códigos:
¡Feliz codificación!
fuente
Tengo la versión de shell MongoDB v3.6.4, debajo del código uso mongoclient, es bueno para mí:
fuente
Si alguien todavía está intentando resolver este error, lo he hecho a continuación.
fuente
useUnifiedTopology: true
, que también se necesita en la actualidad.Las consultas MongoDB devuelven un cursor a una matriz almacenada en la memoria. Para acceder al resultado de esa matriz, debe llamar
.toArray()
al final de la consulta.fuente