2014-04-14 5 views
0

몽구스 문서 집합을 일반 오래된 JavaScript 개체로 반환하려고합니다. 나는 데이터베이스의 쿼리 처리하는 user.js 모듈이 있습니다mongoose document to JSON

module.exports = function() { 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    console.log('connection successful'); 
}); 
var outingSchema = mongoose.Schema({ 
    id : String, 
    location : String, 
    date : Date, 
    participantCount : Number, 
    confirmedParticipantCount : Number, 
    group : String 
}); 
var Outing = mongoose.model('Outing', outingSchema); 

this.dashboard = function() { 
    var result = Outing.find({}, function(err, outings) { 
     console.log('##################'); 
    }); 
    db.close(); 
    return result; 
} 

}

을 그리고 이것은 내 주요 server.js 파일입니다

io.of('/user').on('connection', function(socket) { 
console.log('Incoming connection to ' + socket.namespace.name); 
var User = require('./real/user.js'); 
var UserObject = new User(); 
socket.on('dashboard', function(data) { 
    socket.send(JSON.stringify(UserObject.dashboard(), null, 3)); 
}) 

}); 약자로

, 이것은 항상 예외가 발생합니다 나는 몽구스 문서 객체가 원형 구조의 일종을 가지고 있기 때문에 이런 일이 있으리라 믿고있어

TypeError: Converting circular structure to JSON 

합니다. 어떻게하면 대시 보드() 메서드가 JSON.stringify()을 사용하여 JSON으로 변환 할 수있는 일반 JavaScript 객체를 반환 할 수 있습니까?

나는 각 문서에 outings' and calling the toObject()`메소드를 반복 해 보았습니다 만, 몽구스 문서 객체도 반환합니다.

이상한 점은 console.log('##################'); 문이 실행될 수 없다는 것입니다 (콘솔에 출력이 표시되지 않음). 이것이 콜백 함수에 있기 때문입니까? 기타 콜백 함수의 console.log() 문이 정상적으로 작동합니다.

답변

1

콜백으로 '대시 보드'기능이 필요합니다.

this.dashboard = function(callback) { 
    Outing.find({}, callback); 
}; 

실제로 노드를 사용하여 요청간에 db를 닫고 싶지는 않습니다.

socket.on('dashboard', function(data) { 
    UserObject.dashboard(function(err, results){ 
     if(err){ 
     //send the error to the socket 
     } 
     socket.send(JSON.stringify(results); 
    }); 
}); 
+0

이것은 트릭을 수행하는 것으로 보입니다. 나는 처음부터 잘못하고있는 것을 정말로 이해하지 못합니다. '대시 보드'가 콜백이어야하는 이유는 무엇입니까? 또한 JSON 문자열은'_id' 및'__v' 속성을 포함합니다. 그 표현에서 제외시킬 수있는 방법이 있습니까? – faridghar

+0

후속 질문의 두 번째 부분을 잊어 버릴 수 있습니다. 나는'query.select ('- excludedField')'를 사용하여 투영을 수행했습니다. '대시 보드'를 콜백으로 변환해야하는 이유를 설명해 주시겠습니까? – faridghar

+0

nodejs는 비 차단이므로 쿼리 결과를 바로 가져 오지 못합니다. 그들은 몇몇 언어와 같은 성명서에서 반환되지 않습니다. 결과가 준비되면 콜백 함수가 실행됩니다. nodejs 및 콜백에서 읽습니다. http://www.theprojectspot.com/tutorial-post/nodejs-for-beginners-callbacks/4 –