2012-04-23 2 views
2

ID에서 사용자 이름을 가져 오는 함수를 아래에 작성했습니다. 잘 작동하지 않습니다. console.log (result.first_name);을 작성할 수 있습니다. 쿼리 함수 내에서 사용자 이름이 내 터미널에는 표시되지만 브라우저에는 표시되지 않습니다. 함수 끝에 "return"something ";"을 추가하여 브라우저에 나타나는지 확인하려고 시도했습니다. 쿼리 결과가 반환되도록 함수를 작성하려면 어떻게해야합니까?함수에서 mongojs 쿼리 결과를 반환하십시오.

기능 (app.js에서 전역 함수) (app.js에서)

function usernameFromId(id, callback){ 
    db.users.findOne({ _id: ObjectId(id.toString()) }, function(err, result) { 
     var first_name = result.first_name; 
     console.log(first_name); // names show up in the console… 
     callback(first_name); 
    }); 
}; 

페이지 처리기

app.get('/books', function(req, res){ 
    function timeSince(dato){ 
     moment.lang('nb'); 
     return moment(dato).fromNow(); 
    }; 
    db.books.find().sort({ added:-1 }, function(err, docs) { 
     var books = docs; 
     db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { 
      var activity = docs; 
      res.render('books', { 
       books: books, 
       activity: activity, 
       timeSince: timeSince, 
       usernameFromId: usernameFromId 
      }) 
     }); 
    }); 
}); 

템플릿 (books.jade)

- each a in activity 
    p=usernameFromId(a.user_id, function(name){return name;}) 

답변

-1

같은 것을, 나는 해결책을 발견 할 수 있습니다. 그것이 좋은 것인지 확실하지 않지만 작동합니다. 기능이 필요 없습니다. (app.js에서)

페이지 처리기 :

app.get('/books', function(req, res){ 
    db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) { 
     var activity = docs; 
     db.users.find(function(err, docs) { 
      var users = docs; 
      res.render('books', { 
       page_title:'books', 
       activity: activity, 
       users: users 
      }) 
     }); 
    }); 
}); 

템플릿 (books.jade) : 내가 볼

- each a in activity 
    - for u in users 
     - if (a.user_id == u._id.toString()) 
      | #{u.first_name} 
+1

클로저에서 응답을 래핑하여보다 테스트 가능하도록 만들 수 있습니다. 그런 다음 클로저를 쿼리의 콜백으로 전달하십시오. 따라서 HTTP가 필요없는 모의 (mock)이나 다른 것으로 대체 할 수 있습니다. 내 자신의 비슷한 질문에 내 대답을 참조하십시오 http://stackoverflow.com/questions/11972763/how-to-use-events-keep-mongodb-logic-out-of-node-js-request-handlers – fijiaaron

+0

이것은 정말 해킹 된 솔루션입니다. 반복되는 중첩 된 mongojs 쿼리보다 직관적 인 방법이 있다고 생각합니다. –

2

없음 때문에 자바 스크립트의 비동기 특성을 실제 실행 순서를 나타내는 주석을 코드에 추가했습니다. 이 때문에 오류가 발생합니다.

function usernameFromId(id){ 
    var id = id.toString(); // 1 
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) { 
     var first_name = result.first_name; // 3 
    }); 
    return first_name; // 2 
}; 

편집 : 당신은 아마 다음과 같은

좋아
function usernameFromId(id, callback){ 
    var id = id.toString(); 
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) { 
     var first_name = result.first_name; 
     callback(first_name); 
    }); 
}; 
+0

, 감사합니다. 그래서 다른 방식으로 접근해야합니까? – Frode

+0

방금 ​​만든 편집보기 – deltanovember

+0

"오류 : TypeError : 정의되지 않은 함수가 아닙니다." – Frode

관련 문제