Próbowałem samouczka W3schools na nodeJS z MongoDB.
Kiedy próbuję zaimplementować ten przykład w środowisku nodeJS i wywołać funkcję z wywołaniem AJAX, otrzymałem poniższy błąd:
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)
Poniżej znajduje się mój zaimplementowany kod:
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();
});
});
Zwróć uwagę, że błąd występuje za każdym razem, gdy wykonanie trafi:
db.collection("customers").findOne({}, function(err, result) {}
Zwróć też uwagę (na wypadek, gdyby miało to znaczenie), że zainstalowałem najnowszy pakiet MongoDB dla węzła JS ( npm install mongodb ), a wersja MongoDB to MongoDB Enterprise 3.4.4, ze sterownikiem MongoDB Node.js v3.0.0-rc0.
db.collection()...
od, dziennikiem konsoli, aby sprawdzić, czy tam dotrze. Żaden problem.Odpowiedzi:
Napotkałem to samo. W pliku package.json zmień wiersz mongodb na „mongodb”: „^ 2.2.33”. Będziesz musiał npm odinstalować mongodb; następnie zainstaluj npm, aby zainstalować tę wersję.
To rozwiązało problem. Wygląda na to, że jest to błąd lub dokumenty wymagają aktualizacji.
źródło
Dla osób korzystających z wersji 3.0 natywnego sterownika MongoDB NodeJS:
(Dotyczy to osób z „mongodb”: „^ 3.0.0-rc0” lub nowszą wersją w package.json, które chcą nadal używać najnowszej wersji).
W wersji 2.x natywnego sterownika MongoDB NodeJS otrzymałeś obiekt bazy danych jako argument wywołania zwrotnego connect:
MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => { // Database returned });
Zgodnie z dziennikiem zmian w wersji 3.0 zamiast tego otrzymujesz obiekt klienta zawierający obiekt bazy danych:
MongoClient.connect('mongodb://localhost:27017', (err, client) => { // Client returned var db = client.db('mytestingdb'); });
close()
Metoda została również przeniesiona do klienta. Kod w pytaniu można zatem przetłumaczyć na:MongoClient.connect('mongodb://localhost', function (err, client) { if (err) throw err; var db = client.db('mytestingdb'); db.collection('customers').findOne({}, function (findErr, result) { if (findErr) throw findErr; console.log(result.name); client.close(); }); });
źródło
var db = client.db('mytestingdb');
każdym razem pisać tę ( ) dodatkową linię zamiast po prostu pisać w ten sposób (MongoClient.connect('mongodb://localhost:27017/mytestingdb')
)? Zawsze pracuję z tą samą bazą danych. Czy jest jakieś podejście do wyeliminowania tej dodatkowej linii? To dla mnie trochę czasochłonne.Ci, którzy chcą nadal korzystać z wersji ^ 3.0.1, powinni pamiętać o zmianach w sposobie korzystania z
MongoClient.connect()
metody. Funkcja zwrotna nie zwraca,db
a zamiast tego zwracaclient
, w stosunku do której istnieje funkcjadb(dbname)
, którą należy wywołać, aby uzyskaćdb
żądaną instancję.const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'myproject'; // Use connect method to connect to the server MongoClient.connect(url, function(err, client) { assert.equal(null, err); console.log("Connected successfully to server"); const db = client.db(dbName); client.close(); });
źródło
MongoClient.connect(url (err, client) => { if(err) throw err; let database = client.db('databaseName'); database.collection('name').find() .toArray((err, results) => { if(err) throw err; results.forEach((value)=>{ console.log(value.name); }); }) })
Jedynym problemem z kodem jest to, że uzyskujesz dostęp do obiektu, który zawiera procedurę obsługi bazy danych. Musisz uzyskać bezpośredni dostęp do bazy danych (patrz zmienna bazy danych powyżej). Ten kod zwróci bazę danych w tablicy, a następnie przejdzie przez nią w pętli i zapisze nazwy wszystkich osób w bazie danych.
źródło
Świnka na odpowiedź @MikkaS dla klienta Mongo v3.x, potrzebowałem tylko formatu async / await, który wygląda nieco zmodyfikowany tak:
const myFunc = async () => { // Prepping here... // Connect let client = await MongoClient.connect('mongodb://localhost'); let db = await client.db(); // Run the query let cursor = await db.collection('customers').find({}); // Do whatever you want on the result. }
źródło
Poeksperymentowałem trochę, aby zobaczyć, czy mogę zachować nazwę bazy danych jako część adresu URL. Wolę składnię obietnicy, ale powinna ona nadal działać dla składni wywołania zwrotnego. Zauważ poniżej, że client.db () jest wywoływana bez przekazywania żadnych parametrów.
MongoClient.connect( 'mongodb://localhost:27017/mytestingdb', { useNewUrlParser: true} ) .then(client => { // The database name is part of the url. client.db() seems // to know that and works even without a parameter that // relays the db name. let db = client.db(); console.log('the current database is: ' + db.s.databaseName); // client.close() if you want to }) .catch(err => console.log(err));
Mój plik package.json zawiera listę monbodb ^ 3.2.5.
Opcja „useNewUrlParser” nie jest wymagana, jeśli chcesz poradzić sobie z ostrzeżeniem o wycofaniu. Ale rozsądnie jest używać w tym momencie, dopóki nie wyjdzie wersja 4, w której prawdopodobnie nowy sterownik będzie domyślny i nie będziesz już potrzebować tej opcji.
źródło
Rozwiązałem to łatwo, uruchamiając te kody:
npm uninstall mongodb --save npm install mongodb@2.2.33 --save
Miłego kodowania!
źródło
Mam wersję powłoki MongoDB v3.6.4, poniżej kod użyj mongoclient, to dla mnie dobre:
var MongoClient = require('mongodb').MongoClient, assert = require('assert'); var url = 'mongodb://localhost:27017/video'; MongoClient.connect(url,{ useNewUrlParser: true }, function(err, client) { assert.equal(null, err); console.log("Successfully connected to server"); var db = client.db('video'); // Find some documents in our collection db.collection('movies').find({}).toArray(function(err, docs) { // Print the documents returned docs.forEach(function(doc) { console.log(doc.title); }); // Close the DB client.close(); }); // Declare success console.log("Called find()"); });
źródło
Jeśli ktoś nadal próbuje rozwiązać ten błąd, zrobiłem to jak poniżej.
const MongoClient = require('mongodb').MongoClient; // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'mytestingdb'; const retrieveCustomers = (db, callback)=>{ // Get the customers collection const collection = db.collection('customers'); // Find some customers collection.find({}).toArray((err, customers) =>{ if(err) throw err; console.log("Found the following records"); console.log(customers) callback(customers); }); } const retrieveCustomer = (db, callback)=>{ // Get the customers collection const collection = db.collection('customers'); // Find some customers collection.find({'name': 'mahendra'}).toArray((err, customers) =>{ if(err) throw err; console.log("Found the following records"); console.log(customers) callback(customers); }); } const insertCustomers = (db, callback)=> { // Get the customers collection const collection = db.collection('customers'); const dataArray = [{name : 'mahendra'}, {name :'divit'}, {name : 'aryan'} ]; // Insert some customers collection.insertMany(dataArray, (err, result)=> { if(err) throw err; console.log("Inserted 3 customers into the collection"); callback(result); }); } // Use connect method to connect to the server MongoClient.connect(url,{ useUnifiedTopology: true }, (err, client) => { console.log("Connected successfully to server"); const db = client.db(dbName); insertCustomers(db, ()=> { retrieveCustomers(db, ()=> { retrieveCustomer(db, ()=> { client.close(); }); }); }); });
źródło
useUnifiedTopology: true
, która jest również potrzebna w dzisiejszych czasach.Zapytania MongoDB zwracają kursor do tablicy przechowywanej w pamięci. Aby uzyskać dostęp do wyniku tej tablicy, należy wywołać
.toArray()
na końcu zapytania.db.collection("customers").find({}).toArray()
źródło
Kiedyś działał ze starszymi wersjami klienta MongoDb ~ 2.2.33
Opcja 1: Możesz więc użyć starszej wersji
npm uninstall mongodb --save npm install mongodb@2.2.33 --save
Opcja 2: Nadal używaj nowszej wersji (3.0 i nowszych) i trochę zmodyfikuj kod.
let MongoClient = require('mongodb').MongoClient; MongoClient.connect('mongodb://localhost:27017', function(err, client){ if(err) throw err; let db = client.db('myTestingDb'); db.collection('customers').find().toArray(function(err, result){ if(err) throw err; console.log(result); client.close(); }); });
źródło