Db.collection не является функцией при использовании MongoClient v3.0
Я пробовал учебник W3schools на узлеJS с MongoDB.
Когда я пытаюсь реализовать этот пример в среде nodeJS и вызывать функцию с вызовом AJAX, я получил следующую ошибку:
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)
Ниже приведен мой реализованный код:
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();
});
});
Обратите внимание, что ошибка возникает всякий раз, когда выполняется выполнение:
db.collection("customers").findOne({}, function(err, result) {}
Также обратите внимание (в случае, если это имеет значение), что я установил последний пакет MongoDB для node JS (npm install mongodb), а версия MongoDB - MongoDB Enterprise 3.4.4 с драйвером MongoDB Node.js v3.0.0-RC0.
Ответы
Ответ 1
Я столкнулся с тем же. В package.json измените строку mongodb на "mongodb": "^ 2.2.33". Вам нужно будет npm удалить mongodb; затем установите npm для установки этой версии.
Это решило проблему для меня. Кажется, что ошибка или документы необходимо обновить.
Ответ 2
Для людей с версией 3.0 собственного драйвера NodeJS от MongoDB:
(Это применимо к людям с "mongodb": "^ 3.0.0-rc0" или более поздняя версия в package.json, которые хотят использовать последнюю версию.)
В версии 2.x родной драйвер NodeJS MongoDB вы получите объект базы данных в качестве аргумента для обратного вызова connect:
MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
// Database returned
});
В соответствии с changelog для 3.0 теперь вы получаете объект клиента, содержащий объект базы данных, вместо этого:
MongoClient.connect('mongodb://localhost:27017', (err, client) => {
// Client returned
var db = client.db('mytestingdb');
});
Метод close()
также был перемещен клиенту. Поэтому код в вопросе может быть переведен на:
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();
});
});
Ответ 3
Для тех, кто хочет продолжить использование версии ^ 3.0.1, следует знать о том, как вы используете метод MongoClient.connect()
. Обратный вызов не возвращает db
, а возвращает client
, против которого есть функция с именем db(dbname)
, которую вы должны вызвать, чтобы получить экземпляр db
, который вы ищете.
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();
});
Ответ 4
MongoClient.connect(url (err, db) => {
if(err) throw err;
let database = db.db('databaseName');
database.collection('name').find()
.toArray((err, results) => {
if(err) throw err;
results.forEach((value)=>{
console.log(value.name);
});
})
})
Единственная проблема с вашим кодом заключается в том, что вы обращаетесь к объекту, который содержит обработчик базы данных. Вы должны получить доступ к базе данных напрямую (см. Переменную базы данных выше). Этот код вернет вашу базу данных в виде массива, а затем пройдет по ней и зарегистрирует имя для всех в базе данных.
Ответ 5
В ответ на ответ @MikkaS для Mongo Client v3.x мне просто нужен формат async/await, который выглядит немного измененным, как это:
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.
}
Ответ 6
Я решил это легко, запустив эти коды:
npm uninstall mongodb --save
npm install [email protected] --save
Удачного кодирования!
Ответ 7
У меня есть версия оболочки MongoDB v3.6.4, ниже кода использовать mongoclient, это хорошо для меня:
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()");
});
Ответ 8
Запросы MongoDB возвращают курсор к массиву, хранящемуся в памяти. Чтобы получить доступ к этому результату массива, вы должны вызвать .toArray()
в конце запроса.
db.collection("customers").find({}).toArray()
Ответ 9
Я немного поэкспериментировал, чтобы посмотреть, смогу ли я сохранить имя базы данных как часть URL. Я предпочитаю синтаксис обещания, но он все равно должен работать для синтаксиса обратного вызова. Обратите внимание, что client.db() вызывается без передачи каких-либо параметров.
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));
Мой package.json перечисляет monbodb ^ 3.2.5.
Опция 'useNewUrlParser' не требуется, если вы готовы иметь дело с предупреждением об устаревании. Но разумно использовать его до тех пор, пока не выйдет версия 4, где, по-видимому, новый драйвер будет использоваться по умолчанию, и вам больше не понадобится эта опция.