2011-06-13 3 views
4

내 인생에서 내가 할 수없는 일은 몽구스를 내 익스프레스 앱에서 사용하게한다. 필자는 몽구스를 설치했고, NPM을 통해 몽고 (mongodb)를 설치했다 (몽고스 문서는 몽고 밥이 따로 필요했는지, 어떻게 작동시키는 지에 대해서는 언급하지 않았다).express app nodejs and mongoose db/mongodb 시작하기

다음은 사용하는 코드입니다.

var mongoose = require('mongoose'); 
    mongoose.connect('mongodb://127.0.0.1/my_database'); 

    var Schema = mongoose.Schema, ObjectId = Schema.ObjectId; 

    var Comments = new Schema({ 
     title  : String 
     , body  : String 
     , date  : Date 
    }); 

    var BlogPost = new Schema({ 
     author : ObjectId 
     , title  : String 
     , body  : String 
     , date  : Date 
     , comments : [Comments] 
     , meta  : { 
      votes : Number 
      , favs : Number 
     } 
    }); 

    var BlogPost = mongoose.model('BlogPost', BlogPost); 
    var post = new BlogPost(); 
    post.title='blahblah'; 
    // create a comment 
    post.comments.push({ title: 'My comment' }); 

    post.save(function (err) { 
     if(err){ 
      throw err; 
      console.log(err); 
     }else{ 
      console.log('saved!'); 
     } 
    }); 

누구나 내가 잘못하고있는 것을 알 수 있습니까? 내가 어떻게 든 mongodb를 별도로 시작할 필요가 있는지 이해하지 못한다. (mongoose.connect 함수가 mongodb 서버를 올바르게 시작하는 것처럼 보입니다.)

그러나 내 앱을 시작할 때 아무 일도 일어나지 않습니다. 오류 또는 저장 중 하나가! 내 콘솔에 나는 시험 포스트 권리를 저장할 때?

는 어쨌든 어떤 도움은 매우 극명하게 될 것이다!

감사

+0

여기에 http://goo.gl/HlbXE – Madhusudhan

답변

2

MongoDB를가 완전히 별도의 서비스이며, 아직해야 nodejs가 액세스 할 수 있도록 실행 중입니다.

출력이 보이지 않는 이유는 게시물이 완료되기 전에 프로그램이 종료되었거나이 경우 MongoDB에 도달 할 수 없어서 시간이 초과 되었기 때문입니다.

편집

당신이 MongoDB를 중지 MongoDB를 실행하지 않은 출력을 참조 포함하도록 응용 프로그램을 수정하지 않은 이유 당신은 여전히 ​​호기심 경우 :

// exit program in one minute with an error 
// cancelled if we can successfully talk to MongoDB 
var sentinel = setTimeout(function(){ 
    throw "failed to connect to MongoDB after one minute!"; 
}, 60*1000); // 60 seconds 

post.save(function (err) { 

    clearTimeout(sentinel); // cancel the timeout sentinel 

    if(err){ 
     throw err; 
     console.log(err); // won't occur since the throw will end the program 
    }else{ 
     console.log('saved!'); 
    } 
}); 

process.stdin.resume(); // read from stdin to keep program running 

를하고 다시 실행하십시오.

nodejs는 이벤트 루프 내에서 프로그램을 실행한다는 점에서 대부분의 프로그래밍 환경과 다르다는 것을 알아 두는 것이 중요합니다. 할 일이 없으면 nodejs가 종료됩니다.

그리고 당신의 post.save() 이후

가 MongoDB를에 새 비동기 호출을 시작하고 즉시 반환, 응용 프로그램 것이다 그것은 할에 대해 아무것도가 없기 때문에 즉시 종료합니다. (커버 아래에서 post.save()는 이벤트 루프에 새로운 이벤트 핸들러를 추가하여 호출이 완료 될 때까지 기다립니다.

프로그램이 즉시 종료되지 않도록하기 위해 이벤트를 지시하는 process.stdin.resume()을 추가합니다 루프를 사용하여 각 패스에서 새로운 입력 (표준 입력에서)을 확인함으로써 효과적으로 프로그램을 영원히 실행할 수 있습니다.

Nodejs 기반 네트워크 서버는 동일한 메커니즘을 사용하여 표준 입력 대신 네트워크 소켓에서 입력을 지속적으로 감시합니다.

이벤트 루프 개념이 nodejs에서 프로그래밍하는 것이 얼마나 중요한지는 충분히 강조 할 수 없습니다. 사람들이 노드를 얻는 데 필요한 75 % 이상의 문제가 이벤트 루프를 이해하지 못하고 nodejs 프로그래밍 모델에 어떤 영향을 미치는지 추정 할 수 있습니다.

+0

을 시작할 수있는 데모가 있습니까? 방금 추가했기 때문에 : var mongoose = require ('mongoose'); mongoose.connect ('mongodb : //127.0.0.1/my_database'); console.log (몽구스. 연결.숙주); console.log (mongoose.connection.port); - 포트 27017에 mongodb에 연결되어 있음을 보여줍니다. - 시작해야한다면 (시작하지 않으면 mongo에 연결될 것이라고 생각하지 않습니다.), 그런 다음 어떻게해야합니까? ? – thrice801

+0

확실합니다. MongoDB가 실행되고 있지 않습니까? 또한 호스트와 포트를 인쇄한다고해서 연결이 설정되었다고 보장 할 수는 없습니다. –

+0

코드에서 가장 큰 문제점은 포스트가 비동기 적으로 실행되기 때문에 포스트가 완료되기 전에 nodejs가 종료된다는 것입니다. –

관련 문제