[node.js] MongoClient v3.0을 사용할 때 db.collection이 함수가 아닙니다

MongoDB를 사용하여 nodeJS에서 W3schools 자습서 를 시도 했습니다 .

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) {}

또한 노드 JS 용 최신 MongoDB 패키지 ( npm install mongodb )를 설치 했으며 MongoDB 버전은 MongoDB Enterprise 3.4.4이며 MongoDB Node.js 드라이버 v3.0.0-rc0입니다.



답변

나는 같은 것을 만났다. package.json에서 mongodb 행을 “mongodb”: “^ 2.2.33″으로 변경하십시오. mongodb를 npm 제거해야합니다. 그런 다음 npm install로이 버전을 설치하십시오.

이것은 나를 위해 문제를 해결했습니다. 버그 인 것 같거나 문서를 업데이트해야합니다.


답변

MongoDB 원시 NodeJS 드라이버 버전 3.0 사용자 :

( “mongodb”: “^ 3.0.0-rc0″또는 package.json의 최신 버전 인 최신 버전을 계속 사용하려는 사용자에게 적용됩니다.)

MongoDB 원시 NodeJS 드라이버 버전 2.x에서는 데이터베이스 오브젝트를 연결 콜백에 대한 인수로 가져옵니다.

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

3.0 에 대한 changelog 에 따르면 이제 데이터베이스 오브젝트를 포함하는 클라이언트 오브젝트를 얻게됩니다.

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


답변

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);
        });
    })
})

코드의 유일한 문제점은 데이터베이스 핸들러를 보유하고있는 오브젝트에 액세스한다는 것입니다. 데이터베이스에 직접 액세스해야합니다 (위의 데이터베이스 변수 참조). 이 코드는 데이터베이스를 배열로 반환 한 다음 반복하여 데이터베이스에있는 모든 사람의 이름을 기록합니다.


답변

Mongo Client v3.x에 대한 @MikkaS 답변에 대한 돼지 뒷받침, 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.
}


답변

데이터베이스 이름을 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가 나올 때까지 사용하는 것이 좋습니다.


답변

이 코드를 실행하여 쉽게 해결했습니다.

 npm uninstall mongodb --save

 npm install mongodb@2.2.33 --save

행복한 코딩!