완료되면 몽구스의 연결을 올바르게 닫으십시오.


145

나는 지속적으로 실행되지 않는 스크립트에서 몽구스를 사용하고 있으며 매우 간단한 문제 인 것처럼 보이지만 대답을 찾을 수 없습니다. 간단히 mongodb에 요청을 보내는 mongoose 함수를 호출하면 nodejs 인스턴스가 멈추지 않으며 Ctrl + c 또는 Program.exit ()로 수동으로 종료해야합니다.

코드는 대략 다음과 같습니다.

var mongoose = require('mongoose');

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ?
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models

// if I include this line for example, node never stop afterwards
var MyModel =  mongoose.model('MyModel', MySchema);

mongoose.disconnect ()에 호출을 추가하려고 시도했지만 결과는 없습니다. 그 외에도 모든 것이 잘 작동합니다 (찾기, 저장 등).

이것은이 사람과 똑같은 문제이며 슬프게도 아무런 대답을 얻지 못했습니다 : https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

감사

편집 : 기술적으로 정확하기 때문에 아래 답변을 수락했지만 누군가 가이 문제를 다시 발견하면 몽구스 및 / 또는 mongodb 드라이버가 여전히 실행중인 쿼리가 있는지 물어볼 때 연결을 닫지 않는 것 같습니다.

연결 끊기 호출도 전혀 기억하지 않으며 쿼리 실행이 완료되면 기억하지 않습니다. 예외 나 다른 종류의 호출없이 호출을 버리고 실제로 연결을 닫지 않습니다.

그래서 당신은 그것을 가지고 있습니다 : 실제로 작동하려면 disconnect ()를 호출하기 전에 모든 쿼리가 처리되었는지 확인하십시오.


1
모델을 가져 오는 것만 으로이 작업을 수행 할 수 있습니까? 아래 답변 중 어느 것도 작동하지 않습니다 : \
Anthony

답변:


201

연결을 닫을 수 있습니다

mongoose.connection.close()

25
이것은 실제로 연결을 닫습니다. 그러나이 호출은 내 데이터베이스의 내용을 지우고있었습니다. mongoose.disconnect ()로 전환하면 모든 것이 제대로 작동했고 내 모카 테스트가 다시 제대로 작동하기 시작했습니다.
Brian Noah

1
이것은 나를 위해 일했습니다. 방금 이것을 올바른 콜백에 넣었는지 확인해야했습니다. 그렇지 않으면 데이터베이스에 저장하기 전에 연결을 닫을 수 있었을 것입니다. 공평하게, 나는 여전히 로컬 DB에 연결하고 간단한 예제 사용자 객체를 저장하는 간단한 스크립트를 사용하고 있습니다. user.save () 콜백에서 mongoose.connection.close ()를 호출합니다.
FateNuller

6
보시다시피이 답변은 오래되었습니다. 당신이 사용하는 경우 몽구스 5.0.4을 , 방법은 오직 때문에 사용 만 가능, 내 보냅니다. Connection.close()
Константин Ван

74

다른 대답은 나를 위해 작동하지 않았습니다. 이 답변에mongoose.disconnect(); 명시된대로 사용해야 했습니다 .


테스트 환경을 해체 할 때도 좋습니다.
Matt Lo

1
mongoose.disconnect ()를 사용하는 것이 더 좋고 논리적 접근 방식입니다.
Abdul Alim Shakir

17

연결을 변수로 설정 한 다음 완료되면 연결을 끊을 수 있습니다.

var db = mongoose.connect('mongodb://localhost:27017/somedb');

// Do some stuff

db.disconnect();

내 상황 (농담 내부 몽구스 테스트)이이 일을하는 유일한 솔루션입니다에서
코드 속살

for 루프 내에서 Mongoose로 Model.update (..)를 수행합니다. 업데이트 할 때마다 연결을 닫아야합니까? 내 서버는 많은 업데이트를 처리하고 잠시 후에 작동을 멈췄습니다.
Pille

아래와 같은 답변
Daniel W.

3

4.4.2 버전을 사용하고 있으며 다른 답변은 저에게 효과적이지 않습니다. 그러나 useMongoClient옵션에 추가 하고 호출하는 변수에 넣는 것이 효과가있는 close것 같습니다.

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true })

//do stuff

db.close()

1

메소드 외부에서 닫거나 연결을 끊으려고하면 오류가 발생합니다. 가장 좋은 해결책은 메소드의 두 콜백에서 연결을 닫는 것입니다. 더미 코드가 여기 있습니다.

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});

1

Jake Wilson이 말한 것처럼 : 연결을 변수로 설정 한 다음 완료되면 연결을 끊을 수 있습니다.

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

또는 비동기 기능 내부에있는 경우 :

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

그렇지 않으면 내 환경에서 확인했을 때 오류가 발생합니다.


0

아마 당신은 이것을 가지고 있습니다 :

const db = mongoose.connect('mongodb://localhost:27017/db');

// Do some stuff

db.disconnect();

그러나 다음과 같은 것을 가질 수도 있습니다.

mongoose.connect('mongodb://localhost:27017/db');

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

전화를 걸 수는 없지만 db.disconnect()사용 후 연결을 닫을 수 있습니다.

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.