2015-02-06 1 views
1

express.js은 표준 MVC 개발 패턴을 구현하는 알맞은 베어 본 시스템을 제공합니다. 그러나 대부분의 튜토리얼은 라우트 파일이나 글로벌 앱 파일에 컨트롤러 로직을 적용합니다. 이상적인 세계에서는 Express.JS를 사용하는 기본 MVC 원칙

:

모델은 - 기본 동작 및 데이터

컨트롤러을 관리 - 모델과 뷰에 명령을 전송

보기이 -으로부터 데이터를 렌더링 모델


현재 내가 다음과 같습니다 - 경로 /가 hotels.js 작업에

router.get('/hotels', function(req, res, next) { 
    hotels.run(req, res, next); 
    next(); 
}); 

컨트롤러를 가리키는 -

루트 /하는 index.js 모델에 명령을 전송 컨트롤러를

module.exports = { 
    run: function(req, res, next) { 
     var users = new require('../models/hotels'); 
     users.run(function(callback) { 
      res.render('hotels', { title: 'Hotels page', users: callback }); 
     }); 
    } 
} 

모델/hotel.js - 모델 요청 데이터

module.exports = { 
    run: function(callback) { 
     connection.query(sql, function(err, rows, fields) { 
      callback(rows); 
      //console.log(rows); 
     }); 
    } 
} 

아무리 노력해도 모델에서 데이터를 가져 와서 컨트롤러로 돌아가서 뷰로 전달할 수 없습니다. 내가 표현한 새로운 코드이므로 아마 위의 코드 내에 여러 개의 오류가 있음을 이해합니다. 하지만 기본 있어야합니다, 그리고 내가 왜 모델 데이터를 반환 할 수 없다는 명백한 뭔가가, 콜백 이외의 모든 논리 작동합니다.

+0

경로에서 컨트롤러에 전달했기 때문에'next'를 두 번 실행 한 후 다음 줄에서 실행하면됩니다. 둘 중 하나만 수행하십시오. 나는 또한 router.get ('/ hotels', hotels.run)에 대한 경로를 단순화 할 것이다. –

+0

팁 덕분에 @KevinB가 수정 될 것이다. – gardni

답변

0

사람들이 express.js 프로젝트에서 유사한 MVC 접근 방식을 사용하고 싶다면이 문제를 해결했다고 생각합니다.

routes.js - Kevin의 클리너 방식과 일치하도록 변경되었습니다.

router.get('/hotels', hotels.run); 

컨트롤러/hotels.js -

module.exports = { 
    run: function(req, res, next) { 
     var users = new require('../models/hotels'); 
     users.run(function(err, callback) { 
      res.render('hotels', { title: 'Hotels page', users: callback }); 
     }); 
    } 
} 

모델/제공, 컨트롤러의 요청에 따라

module.exports = { 
    run: function(callback) { 
     connection.query(sql, function(err, rows, fields) { 
      callback(err, rows); 
     }); 
    } 
} 

는 이제 모델이 쿼리를 반환 hotel.js 컨트롤러는 데이터를 뷰에 전달하는 기능을 제공합니다.