децибел.коллекция не является функцией при использовании MongoClient v3. 0


Я W3schools учебник на nodeJS с MongoDB.

когда я пытаюсь реализовать этот пример в среде nodeJS и вызвать функцию с помощью вызова AJAX, я получил сообщение об ошибке ниже:

TypeError: db.collection is not a function
    at c:UsersuserDesktopWeb ProjectWebService.JS:79:14
    at args.push (c:Usersusernode_modulesmongodblibutils.js:431:72)
    at c:Usersusernode_modulesmongodblibmongo_client.js:254:5
    at connectCallback (c:Usersusernode_modulesmongodblibmongo_client.js:933:5)
    at c:Usersusernode_modulesmongodblibmongo_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 для узел JS (npm install mongodb), а версия MongoDB-это MongoDB Enterprise 3.4.4, с узлом MongoDB.JS driver v3.0.0-rc0.

7 68

7 ответов:

Я столкнулся с тем же самым. В комплексе.json, измените строку mongodb на "mongodb": "^2.2.33". Вам нужно будет npm удалить mongodb; затем npm install для установки этой версии.

Это решило проблему для меня. Кажется, ошибка или документы должны быть обновлены.

для людей на версии 3.0 родного драйвера NodeJS MongoDB:

(это применимо к людям с "mongodb": "^3.0.0-rc0", или более поздней версии в пакете.json, которые хотят продолжать использовать последнюю версию.)

в версии 2.х MongoDB родной драйвер NodeJS вы получите объект базы данных в качестве аргумента для обратного вызова connect:

MongoClient.connect('mongodb://localhost:27017/mytestingdb', (err, db) => {
  // Database returned
});

по словам список изменений для версии 3.0 теперь вы получаете клиентский объект, содержащий объект базы данных вместо:

MongoClient.connect('mongodb://localhost:27017', (err, client) => {
  // Client returned
  var db = client.db('mytestingdb');
});

The 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.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();
});

Piggy backing на @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.
}
        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);
         });
        })
      })

единственная проблема с вашим кодом-это доступ к объекту, который содержит базу данных. Вы должны получить доступ к базе данных напрямую (см. переменную базы данных выше). Этот код вернет вашу базу данных в массиве, а затем он проходит через него и регистрирует имя для всех в базе данных.

Я решил это легко, выполнив следующие коды:

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

Удачи В Кодировании!

У меня есть MongoDB shell version 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()");
 });