2015-01-17 3 views
2

좋아, 지난 며칠 동안 나는 Node를 망치기 시작했다. (실제로 유용한 것을 배워야하고 나에게 일자리를 줄 수 있다고 생각하기 때문이다.) 지금은 페이지를 제공하는 방법, 기본 라우팅 등을 알고 있습니다. 좋은. 그러나 데이터베이스에 정보를 쿼리하는 방법을 배우고 싶습니다.Express와 함께 NodeJS를 사용하여 MongoDB에서 데이터 가져 오기

지금 당장 웹 익스트림 웹 사이트로 사용되는 앱을 제작하려고합니다. 그래서 이론적으로, 나는 URL을 입력 할 때 데이터베이스를 조회해야하는 응용 프로그램은 http://localhost:3000/comic/<comicid>

나는 나의 app.js 파일에 다음 코드를했다 : 나는 "출력 console.log(getName())이 설정으로

router.get('/', function(req, res) { 
    var name = getName(); 
    console.log(name); // this prints "undefined" 

    res.render('index', { 
     title: name, 
     year: date.getFullYear() 
    }); 
}); 

function getName(){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    var returnable_name; 
     if (objs.length == 1) 
     { 
      returnable_name = objs[0].name; 
      console.log(returnable_name); // this prints "Renato", as it should 
      return returnable_name; 
     } 
    }); 
} 

를 얻을 수 정의되지 않은 "콘솔에서,하지만 난왜 그걸로 쿼리가 실제로 데이터베이스에서 찾을 수있는 유일한 요소를 얻을 모르겠다.

나는 Google에서 검색을 시도했지만 Google에서는 검색을 시도했지만 성공하지 못했습니다.

개체에서 매개 변수 이름을 가져 오려면 어떻게해야합니까?

답변

1

NodeJs는 비동기입니다. 콜백이 필요하거나 Promise이 필요합니다.

router.get('/', function(req, res) { 
    var name = ''; 
    getName(function(data){ 
     name = data; 
     console.log(name); 

     res.render('index', { 
      title: name, 
      year: date.getFullYear() 
     }); 
    }); 
}); 

function getName(callback){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
     var returnable_name; 
     if (objs.length == 1) 
     { 
      returnable_name = objs[0].name; 
      console.log(returnable_name); // this prints "Renato", as it should 
      callback(returnable_name); 
     } 
    }); 
} 
+0

이 기능은 작동하지만 (응용 프로그램이 중단되지 않고 브라우저에서 색인 페이지가 렌더링되기 때문에) 제목이 설정되지 않습니다. 적어도 내 시험은 아니야. 제목은 비어 있고 기본값은 "localhost : 3000"입니다. –

+0

콜백에 렌더링을 추가 했습니까? – MaximeF

+0

나는 당신이 의미하는 것을 얻지 못한다. 코드는 귀하의 코드와 같습니다. 정보를 getName에서 가져 와서 "name"에 할당 한 다음 res.render()에서 사용합니다. –

1

getName 함수 db.test.find와 몽고에 비동기 호출하고있다. 비동기 함수 다음에 console.log을 추가하여이를 볼 수 있습니다. 이처럼 모든 likeliness에서

function getName(){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    var returnable_name; 
    if (objs.length == 1) { 
     returnable_name = objs[0].name; 
     console.log(returnable_name); 
     return returnable_name; 
    } 
    }); 
    console.log('test'); // <!-- Here 
} 

이 출력됩니다 :

test 
Renato 

당신은 당신의 getName 함수에 콜백을 제공해야합니다.

router.get('/', function(req, res) { 
    getName(function(err, name) { 
    res.render('index', { 
     title: name, 
     year: date.getFullYear() 
    }); 
    })' 
}); 

function getName(cb){ 
    db.test.find({name: "Renato"}, function(err, objs){ 
    if(err) cb(err); 
    var returnable_name; 
    if (objs.length == 1) { 
     returnable_name = objs[0].name; 
     return cb(null, returnable_name); 
    } else { 
     // Not sure what you want to do if there are no results 
    } 
    }); 
} 
관련 문제