ExpressJS 애플리케이션을 구성하는 방법은 무엇입니까?
익스프레스를 사용하고 있습니다.NodeJS용 JS 웹 프레임워크입니다.
Express JS는 테스트 경로 을 JS에 배치했습니다.app.js
앱이 크면 app.js가 너무 크기 때문에 아름다운 방법이 아니라고 생각합니다!
다음 디렉터리 구조를 원합니다.
| my-application
| -- app.js
| -- config/
| -- environment.js
| -- routes.js
내 코드는 다음과 같습니다.
app.js
var express = require('express');
var app = module.exports = express.createServer();
require('./config/environment.js')(app, express);
require('./config/routes.js')(app);
app.listen(3000);
config/environment.js
module.exports = function(app, express){
app.configure(function() {
app.use(express.logger());
});
app.configure('development', function() {
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
};
구성/설정제이에스
module.exports = function(app) {
app.get('/', function(req, res) {
res.send('Hello world !');
});
};
제 코드는 잘 작동하고 디렉토리의 구조가 아름답다고 생각합니다.하지만 코드가 수정되어야 했고 그것이 좋은지/아름다운지는 잘 모르겠습니다.
내 디렉토리 구조를 사용하여 코드를 조정하는 것이 더 나은가요, 아니면 단순히 하나의 파일(app.js)을 사용하는 것이 더 나은가요?
조언해 주셔서 감사합니다!
좋아요. 오랜만에 하는 질문인데요. 그래서 저는 중간 크기의 express.js 응용 프로그램을 어떻게 구성하는지에 대한 자바스크립트 코드와 긴 README로 스패딩 github 저장소를 만들었습니다.
focusaurus/focus_code_structure는 이에 대한 최신 코드를 가진 repo입니다.꺼내기 요청을 환영합니다.
스택 오버플로는 단순한 링크 답변을 좋아하지 않으므로 여기 README의 스냅샷이 있습니다.이것은 제가 계속 업데이트할 새로운 프로젝트이기 때문에 몇 가지 업데이트를 할 것입니다. 하지만 궁극적으로 github repo는 이 정보에 대한 최신 장소가 될 것입니다.
# 익스프레스 코드 구조
이 프로젝트는 중간 크기의 express.js 웹 응용 프로그램을 구성하는 방법의 예입니다.
2016년 12월 v4.14 이상을 표현하는 현재
애플리케이션의 크기는 얼마나 됩니까?
웹 애플리케이션이 모두 같지는 않으며, 제 생각에는 모든 express.js 애플리케이션에 적용되어야 하는 단일 코드 구조가 없습니다.
응용프로그램이 작으면 여기에 예시된 것처럼 깊은 디렉토리 구조가 필요하지 않습니다. 한 돼요..js
저장소 루트에 있는 파일을 확인하면 완료됩니다. Voila.
만약 당신의 애플리케이션이 거대하다면, 당신은 어느 시점에서 그것을 별개의 npm 패키지로 분할할 필요가 있습니다.일반적으로 node.js 접근 방식은 적어도 라이브러리의 경우 많은 작은 패키지를 선호하는 것으로 보이며, 여러 npm 패키지를 사용하여 응용 프로그램을 빌드해야 합니다. 그러면 오버헤드가 타당해지고 정당화되기 시작합니다.따라서 응용프로그램이 증가하고 코드의 일부가 응용프로그램 외부에서 재사용 가능하게 되거나 하위 시스템이 될 경우 자체 git 저장소로 이동하여 독립 실행형 npm 패키지로 만드십시오.
따라서 이 프로젝트의 초점은 중간 규모의 애플리케이션을 위한 실행 가능한 구조를 설명하는 것입니다.
귀사의 전체 아키텍처는 무엇입니까?
웹 애플리케이션을 구축하는 데는 다음과 같은 많은 접근 방식이 있습니다.
- 서버 측 MVC, 레일 위의 Ruby
- 단일 페이지 응용프로그램 스타일a MongoDB/Express/각형/노드(평균)
- 일부 양식이 있는 기본 웹 사이트
- 모델/운영/뷰/이벤트 스타일라 MVC가 중단되었습니다. 다음 단계로 넘어갈 시간입니다.
- 그리고 현재와 역사적인 다른 많은 것들.
이들은 각각 다른 디렉토리 구조에 적합합니다.이 예제의 목적을 위해, 이는 단지 발판일 뿐 완전히 작동하는 앱은 아니지만, 다음과 같은 주요 아키텍처 사항을 가정합니다.
- 사이트에 기존의 정적 페이지/템플릿이 있음
- 사이트의 "응용프로그램" 부분은 단일 페이지 응용프로그램 스타일로 개발됩니다.
- 애플리케이션이 REST/JSON 스타일 API를 브라우저에 표시합니다.
- 이 앱은 단순한 비즈니스 도메인을 모델링합니다. 이 경우에는 자동차 딜러점 애플리케이션입니다.
루비 온 레일즈는?
Ruby on Rails와 그들이 채택한 "Convention over Configuration" 결정이 널리 받아들여지고 사용되기는 하지만 실제로는 큰 도움이 되지 않으며 때로는 이 저장소가 권장하는 것과 반대되는 경우도 있다는 것이 이 프로젝트 전반에 걸쳐 주제가 될 것입니다.
여기서 제 요점은 코드를 구성하는 데에는 기본적인 원칙이 있다는 것이며, 이러한 원칙을 바탕으로 Ruby on Rails 커뮤니티에 Ruby on Rails 규약이 (대부분) 타당하다는 것입니다.하지만, 그런 관습들을 무심코 어루만지는 것은 요점을 놓치고 있습니다.기본 원칙을 파악하면 셸 스크립트, 게임, 모바일 앱, 엔터프라이즈 프로젝트, 홈 디렉토리 등 모든 프로젝트가 잘 정리되고 명확해집니다.
Rails 커뮤니티의 경우 단일 Rails 개발자가 앱에서 앱으로 전환하고 매번 익숙하고 편안하게 사용할 수 있기를 원합니다.이는 37개의 신호 또는 Pivotal Labs의 경우 매우 의미가 있으며 이점이 있습니다.서버 쪽 자바스크립트 세계에서 전반적인 정신은 서부의 모든 것이 훨씬 더 거칠고 우리는 그것에 대해 별로 문제가 없습니다.이렇게 굴리는 거예요.우리는 거기에 익숙합니다.express.js 내에서도 Rails가 아닌 Sinatra와 가까운 관계이며 Rails로부터 규약을 얻는 것은 일반적으로 아무 도움이 되지 않습니다.구성보다 관습보다 원칙이라고도 할 수 있습니다.
기본 원칙 및 동기 부여
- 정신적으로 관리 가능
- 뇌는 한 번에 소수의 관련된 것들만 처리하고 생각할 수 있습니다.그래서 우리는 디렉토리를 사용합니다.그것은 작은 부분에 집중함으로써 복잡성에 대처할 수 있도록 도와줍니다.
- 크기에 적합합니다.
- 하나의 파일만 있고 세 개의 디렉터리만 있는 "맨션 디렉터리"를 만들지 마십시오.이러한 현상은 3개의 파일이 있는 1개의 디렉토리가 훨씬 더 적합할 때 작은 프로젝트를 10개 이상의 디렉토리를 생성하여 10개 이상의 파일을 저장하도록 만드는 Ansible Best Practices에서 확인할 수 있습니다.버스 운전사가 아니면 출근할 때 버스를 운전하지 않으므로 실제 파일에 의해 정당화되지 않는 파일 시스템 구조를 만들지 마십시오.
- 모듈식이지만 실용적이어야 합니다.
- 노드 커뮤니티는 전반적으로 작은 모듈을 선호합니다.앱에서 완전히 분리될 수 있는 모든 것은 내부 사용을 위해 모듈로 추출하거나 npm에 공개해야 합니다.그러나 여기에 해당하는 중간 규모의 애플리케이션의 경우, 그 오버헤드로 인해 워크플로우에 상당한 가치를 제공하지 못할 수 있습니다.따라서 완전히 별도의 npm 모듈을 정당화하기에는 충분하지 않은 코드가 존재하는 경우 "프로토 모듈"로 간주하여 크기 임계값을 초과하면 추출됩니다.
- @hij1nx와 같은 몇몇 사람들은 심지어 포함합니다.
app/node_modules
및 have 디토및보유리렉.package.json
이러한 전환을 촉진하고 주의사항 역할을 하는 프로토타입 디렉토리의 파일입니다.
- 코드를 쉽게 찾을 수 있습니다.
- 빌드할 기능이나 수정할 버그를 고려할 때 개발자가 관련된 소스 파일을 찾는 데 어려움을 겪지 않는 것이 우리의 목표입니다.
- 이름은 의미 있고 정확합니다.
- Crufty 코드가 완전히 제거되었거나, 분리된 파일에 남아 있지 않거나, 그냥 주석 처리되지 않았습니다.
- 빌드할 기능이나 수정할 버그를 고려할 때 개발자가 관련된 소스 파일을 찾는 데 어려움을 겪지 않는 것이 우리의 목표입니다.
- 검색하기 편리합니다.
- 1차 코드는 모든퍼소코드에 .
app
이 할 수 있는 .cd
find run find/grep/xargs/ag/ack/에 .
- 1차 코드는 모든퍼소코드에 .
- 간단하고 명확한 이름 지정 사용
- names가 필요한 것 . npm은 패키지 이름입니다.나는 이것이 가장 끔찍하다고 생각하지만 나는 무리를 따라야 하기 때문에 파일 이름은 사용해야 합니다.
kebab-case
JavaScript에서 변수 이름은 다음과 같아야 합니다.camelCase
-
는 JavaScript에서 빼기 기호입니다. - 이름과 하지만, "" "" "" " " " "는 모듈의 기본 이름과 일치합니다.
kebab-case
으로 변환됨.camelCase
- names가 필요한 것 . npm은 패키지 이름입니다.나는 이것이 가장 끔찍하다고 생각하지만 나는 무리를 따라야 하기 때문에 파일 이름은 사용해야 합니다.
- 기능이 아닌 커플링별 그룹화
- Ruby on Rails전의 on Rails 입니다.
app/views
,app/controllers
,app/models
,주요사항 - 기능이 전체 스택에 추가되므로 내 기능과 관련된 전체 파일 스택에 초점을 맞추고 싶습니다.사용자 모델에 전화번호 필드를 추가할 때는 사용자 컨트롤러 이외의 컨트롤러는 신경쓰지 않고 사용자 모델 이외의 모델은 신경쓰지 않습니다.
- 따라서 각 디렉터리에 있는 6개의 파일을 편집하고 해당 디렉터리에 있는 수많은 다른 파일을 무시하는 대신 이 저장소는 기능을 구축하는 데 필요한 모든 파일이 배치되도록 구성됩니다.
- MVC의 특성상 사용자 뷰는 사용자 모델에 연결된 사용자 컨트롤러에 연결됩니다.따라서 사용자 모델을 변경할 때 이 세 개의 파일이 함께 변경되는 경우가 많지만 딜 컨트롤러나 고객 컨트롤러는 분리되어 있으므로 관련이 없습니다.일반적으로 MVC가 아닌 설계에도 동일하게 적용됩니다.
- 어떤 코드가 어떤 모듈에 들어가는지에 대한 MVC 또는 MOVE 스타일 디커플링은 여전히 권장되지만 MVC 파일을 형제 디렉토리로 분산시키는 것은 짜증나는 일입니다.
- 따라서 각 경로 파일에는 소유한 경로의 일부가 있습니다. 스타일의 일타일스레
routes.rb
파일은 앱의 모든 경로에 대한 개요를 원할 경우 유용하지만 실제로 기능을 구축하고 버그를 수정할 때는 변경하는 조각과 관련된 경로에만 관심이 있습니다.
- Ruby on Rails전의 on Rails 입니다.
- 코드 옆에 검정 저장
- 이것은 "커플링에 의한 그룹"의 예에 불과하지만, 저는 그것을 구체적으로 말하고 싶었습니다.저는 테스트가 "테스트"라는 병렬 파일 시스템에서 작동하는 많은 프로젝트를 작성했습니다. 이제 테스트를 해당 코드와 동일한 디렉터리에 저장하기 시작했으므로, 저는 다시는 돌아가지 않을 것입니다.이것은 더 모듈화되고 텍스트 편집기 내에서 훨씬 더 쉽게 작업할 수 있으며 ".../.../." 경로의 허튼소리를 많이 줄여줍니다.만약 여러분이 의심스럽다면, 몇 가지 프로젝트에서 그것을 시도하고 스스로 결정하세요.저는 당신에게 더 나은 것이라고 확신시키기 위해 이것 이외의 어떤 것도 하지 않을 것입니다.
- 이벤트와의 교차 절단 커플링 감소
- "좋아요, 새로운 거래가 생성될 때마다 모든 영업 사원에게 이메일을 보내고 싶어요."라고 생각하는 것은 쉬운 일입니다. 그런 다음 거래를 생성하는 경로에 해당 이메일을 전송하는 코드를 입력하면 됩니다.
- 하지만, 이 결합은 결국 당신의 앱을 거대한 진흙덩어리로 만들 것입니다.
- 대신 딜 모델은 "생성" 이벤트를 실행하고 시스템이 이에 대응하여 무엇을 할 수 있는지 전혀 알지 못하는 상태여야 합니다.
- 이방으로코작드모면사든관성용다코있에수에 넣는 것이 더 .
app/users
사용자 코드 기반의 순수성을 오염시키는 결합된 비즈니스 논리가 도처에 존재하지 않기 때문입니다.
- 코드 흐름을 추적할 수 있습니다.
- 마술 같은 짓은 하지 마.파일 시스템의 마법 디렉터리에서 파일을 자동으로 로드하지 마십시오.레일즈처럼 굴지 마. 시간은 다음과 같습니다.
app/server.js:1
코드를 따라 로드하고 실행하는 모든 것을 볼 수 있습니다. - 경로에 DSL을 만들지 마십시오.요청이 없을 때 어리석은 메타프로그래밍을 하지 마세요.
- 만약 당신의 앱이 너무 커서 하는 것.
magicRESTRouter.route(somecontroller, {except: 'POST'})
기본 3개 이상의 큰 승리입니다.app.get
,app.put
,app.del
통화, 당신은 아마도 너무 커서 효과적으로 작업할 수 없는 단일 앱을 구축하고 있을 것입니다.3개의 단순한 라인을 1개의 복잡한 라인으로 변환하는 것이 아니라 BIG 승리에 대한 환상을 가져보세요.
- 마술 같은 짓은 하지 마.파일 시스템의 마법 디렉터리에서 파일을 자동으로 로드하지 마십시오.레일즈처럼 굴지 마. 시간은 다음과 같습니다.
- 소문자 케밥 대소문자 파일 이름 사용
- 이 형식을 사용하면 플랫폼 전반에서 파일 시스템 대소문자 구분 문제를 방지할 수 있습니다.
- npm은 새 패키지 이름에 대문자를 사용하는 것을 금지하며, 이것은 그것과 잘 작동합니다.
express.js 세부 사항
- 사용하지
app.configure
그것은 거의 완전히 쓸모가 없고 당신은 그것이 필요하지 않습니다.그것은 부주의한 카피 파스타 때문에 많은 상용판에 있습니다. - 속달 문제에 있어서 미들웨어와 경로의 순서!!!
- 스택 오버플로에서 볼 수 있는 라우팅 문제의 거의 대부분은 고속 미들웨어가 고장났습니다.
- 일반적으로, 당신은 당신의 경로가 분리되기를 원하며, 그렇게 많이 의존하지 않기를 원합니다.
- 사용하지
app.use
에서 두 미들웨어가 를 보고 있어, 전개애나대에션해경미필경 2들의만가어요한우웨다있니습보는에고체당을신로이케플리나개▁for경ware(▁applic▁for▁you우ationi▁if,요필한▁that▁middle▁your다니▁(있▁routes▁entire전습▁2▁need)body-parser
) - 모든 것이 완료되면 다음과 같은 주문이 정확하게 전달되는지 확인합니다.
- 매우 중요한 모든 애플리케이션 전체 미들웨어
- 모든 경로 및 다양한 경로 미들웨어
- 그러면 오류 처리기
- 슬프게도, 시나트라에서 영감을 받은 익스프레스.js는 대부분 당신의 모든 경로가 있을 것이라고 가정합니다.
server.js
중간 응용 의 경우, 를 별도의 것은, 가 맞지 않는 을 초래합니다.
앱 심볼릭 트릭
Node.js에 대한 더 나은 로컬 요구() 경로에서 커뮤니티가 설명하고 자세히 논의한 많은 접근 방식이 있습니다.저는 곧 "그냥 많은 .../.../.../..." 또는 requireFrom 모델을 사용하는 것을 선호할 수도 있습니다.하지만 현재 저는 아래와 같은 심볼릭 트릭을 사용하고 있습니다.
프로젝트 수 한 은 ▁paths▁like▁requires▁relative▁so▁with다합▁annoying니▁intra-필로요따project라▁to▁one▁way경▁avoid로를상대가성과 같은 성가신 관계 경로를 요구합니다.require("../../../config")
다음과 같은 속임수를 쓰는 것입니다.
- node_symlink는 symlink입니다.
- cd node_module && ln -nsf ..../app
- git에 전체 node_dll 폴더가 아닌 node_dll/app symlink 자체만 추가합니다.
- git add -f node_module/app
- "node_modules"와 "node_modules"에도 ".
.gitignore
- 아니요, "node_modules"를 git 저장소에 넣으면 안 됩니다.어떤 사람들은 당신에게 이렇게 하라고 권할 것입니다.그들은 틀렸습니다.
- 이제 이 접두사를 사용하여 프로젝트 내 모듈을 요구할 수 있습니다.
var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;
- 기본적으로 프로젝트 내 요구사항은 외부 npm 모듈의 요구사항과 매우 유사합니다.
- 죄송합니다. Windows 사용자는 상위 디렉터리 상대 경로를 유지해야 합니다.
배열
JavaScript 과▁only▁a▁modules▁and▁expect▁java만 예상하도록 코드화합니다.options
개체가 전달되었습니다..app/server.js
.app/config.js
모듈.거기서 그것은 작은 것을 합성할 수 있습니다.options
필요에 따라 하위 시스템을 구성하는 개체이지만 모든 하위 시스템을 추가 정보로 가득 찬 큰 글로벌 구성 모듈에 결합하는 것은 잘못된 결합입니다.
연결 매개 변수를 전달하고 하위 시스템에서 직접 나가는 연결을 만드는 대신 DB 연결을 중앙 집중화하여 하위 시스템으로 전달합니다.
NODE_ENV
이것은 레일즈로부터 전해진 또 다른 매력적이지만 끔찍한 아이디어입니다.앱에는 한 인 당의앱에정확한히합곳니다있어야이신는▁in▁be▁place,▁exactly▁there▁1합다▁should니▁app▁your당야가 있어야 합니다.app/config.js
것은그봅니다것을그▁▁at▁▁that니다봅을.NODE_ENV
환경 변수입니다.다른 모든 항목은 클래스 생성자 인수 또는 모듈 구성 매개 변수로 명시적 옵션을 사용해야 합니다.
모듈에 전자 메일 방법, log , queue 등에 대한 옵션이 에는 " " " " (SMTP, stdout ", " " " 와 같은 옵션을 .{deliver: 'stdout'}
하지만 절대 확인해서는 안 됩니다.NODE_ENV
.
테스트
이제 테스트 파일을 해당 코드와 동일한 디렉터리에 보관하고 파일 이름 확장명 명명 규칙을 사용하여 테스트와 프로덕션 코드를 구분합니다.
foo.js
"foo"가 .foo.tape.js
에 대한 한 dirfoo에 있습니다.foo.btape.js
할 수 .
파일 시스템 글러브를 사용하고 있습니다.find . -name '*.tape.js'
필요에 따라 모든 테스트에 액세스할 수 있습니다.
각의내부서코방구법성 .js
파일
이 프로젝트의 범위는 대부분 파일과 디렉터리가 어디로 이동하는지에 대한 것이며, 다른 범위를 추가하고 싶지는 않지만 코드를 세 개의 다른 섹션으로 구성한다는 점만 언급하겠습니다.
- 공통 블록의 시작JS는 종속성 상태를 호출해야 합니다.
- 순수 자바스크립트의 주 코드 블록입니다.공통 없음여기 JS 오염.내보내기, 모듈 또는 요구를 참조하지 마십시오.
- 공통 블록 닫기내보내기 설정을 위한 JS
업데이트(2013-10-29): 일반적인 수요에 의해 커피스크립트 대신 자바스크립트가 포함된 제 다른 답변과 이 주제에 대한 제 최신 권장 사항을 자세히 설명한 상용어판 Github repo 및 광범위한 README도 참조하십시오.
구성
당신이 하는 일은 괜찮습니다.나는 레벨인 최상수자구체성네싶설습정에 설정하는 것을 .config.coffee
이렇게 중첩된 네임스페이스가 있는 파일입니다.
#Set the current environment to true in the env object
currentEnv = process.env.NODE_ENV or 'development'
exports.appName = "MyApp"
exports.env =
production: false
staging: false
test: false
development: false
exports.env[currentEnv] = true
exports.log =
path: __dirname + "/var/log/app_#{currentEnv}.log"
exports.server =
port: 9600
#In staging and production, listen loopback. nginx listens on the network.
ip: '127.0.0.1'
if currentEnv not in ['production', 'staging']
exports.enableTests = true
#Listen on all IPs in dev/test (for testing from other machines)
exports.server.ip = '0.0.0.0'
exports.db =
URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"
sysadmin 편집에 적합합니다.그런 다음 DB 연결 정보와 같은 것이 필요할 때는
require('./config').db.URL
경로/컨트롤러
저는 을 제 에게 맡겨서 로 .app/controllers
하위 디렉터리.그러면 저는 그들을 적재하고 그들이 필요한 모든 경로를 추가하도록 할 수 있습니다.
내 안에서app/server.coffee
커피 스크립트 파일 작업:
[
'api'
'authorization'
'authentication'
'domains'
'users'
'stylesheets'
'javascripts'
'tests'
'sales'
].map (controllerName) ->
controller = require './controllers/' + controllerName
controller.setup app
다음과 같은 파일이 있습니다.
app/controllers/api.coffee
app/controllers/authorization.coffee
app/controllers/authentication.coffee
app/controllers/domains.coffee
를 들어,에 " " 예들도컨러에는롤트"가.setup
이와 같이 기능합니다.
exports.setup = (app) ->
controller = new exports.DomainController
route = '/domains'
app.post route, controller.create
app.put route, api.needId
app.delete route, api.needId
route = '/domains/:id'
app.put route, controller.loadDomain, controller.update
app.del route, controller.loadDomain, exports.delete
app.get route, controller.loadDomain, (req, res) ->
res.sendJSON req.domain, status.OK
뷰
에 뷰 app/views
관습적인 장소가 되고 있습니다.이렇게 배치를 합니다.
app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade
정적 파일
안으로 들어가자public
하위 디렉터리.
Github/Semver/NPM
github의 gitrepo 루트에 README.md 마크다운 파일을 저장합니다.
짐을 꾸리세요.당신의 Gitrepo 루트에 NPM의 의미론적 버전 번호가 있는 json 파일.
다음은 다른 여러 사람의 요청에 따라 커피스크립트에서 바닐라 JS로 포팅된 피터 라이언스의 답변입니다.피터의 대답은 매우 가능하며, 제 대답에 투표하는 사람은 누구나 그의 대답에도 투표해야 합니다.
구성
당신이 하는 일은 괜찮습니다.나는 레벨인 최상수자구체성네싶설습정에 설정하는 것을 .config.js
이렇게 중첩된 네임스페이스가 있는 파일입니다.
// Set the current environment to true in the env object
var currentEnv = process.env.NODE_ENV || 'development';
exports.appName = "MyApp";
exports.env = {
production: false,
staging: false,
test: false,
development: false
};
exports.env[currentEnv] = true;
exports.log = {
path: __dirname + "/var/log/app_#{currentEnv}.log"
};
exports.server = {
port: 9600,
// In staging and production, listen loopback. nginx listens on the network.
ip: '127.0.0.1'
};
if (currentEnv != 'production' && currentEnv != 'staging') {
exports.enableTests = true;
// Listen on all IPs in dev/test (for testing from other machines)
exports.server.ip = '0.0.0.0';
};
exports.db {
URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"
};
sysadmin 편집에 적합합니다.그런 다음 DB 연결 정보와 같은 것이 필요할 때는
require('./config').db.URL
경로/컨트롤러
저는 을 제 에게 맡겨서 로 .app/controllers
하위 디렉터리.그러면 저는 그들을 적재하고 그들이 필요한 모든 경로를 추가하도록 할 수 있습니다.
내 안에서app/server.js
Javascript 파일:
[
'api',
'authorization',
'authentication',
'domains',
'users',
'stylesheets',
'javascripts',
'tests',
'sales'
].map(function(controllerName){
var controller = require('./controllers/' + controllerName);
controller.setup(app);
});
다음과 같은 파일이 있습니다.
app/controllers/api.js
app/controllers/authorization.js
app/controllers/authentication.js
app/controllers/domains.js
를 들어,에 " " 예들도컨러에는롤트"가.setup
이와 같이 기능합니다.
exports.setup = function(app) {
var controller = new exports.DomainController();
var route = '/domains';
app.post(route, controller.create);
app.put(route, api.needId);
app.delete(route, api.needId);
route = '/domains/:id';
app.put(route, controller.loadDomain, controller.update);
app.del(route, controller.loadDomain, function(req, res){
res.sendJSON(req.domain, status.OK);
});
}
뷰
에 뷰 app/views
관습적인 장소가 되고 있습니다.이렇게 배치를 합니다.
app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade
정적 파일
안으로 들어가자public
하위 디렉터리.
Github/Semver/NPM
github의 gitrepo 루트에 README.md 마크다운 파일을 저장합니다.
짐을 꾸리세요.당신의 Gitrepo 루트에 NPM의 의미론적 버전 번호가 있는 json 파일.
제 질문은 2011년 4월에 소개되었습니다. 꽤 오래된 질문입니다.이 기간 동안 저는 Express.js에 대한 경험과 이 라이브러리를 사용하여 작성된 응용프로그램을 설계하는 방법을 개선할 수 있었습니다.그래서, 저는 제 경험을 여기에 공유합니다.
내 디렉토리 구조는 다음과 같습니다.
├── app.js // main entry
├── config // The configuration of my applications (logger, global config, ...)
├── models // The model data (e.g. Mongoose model)
├── public // The public directory (client-side code)
├── routes // The route definitions and implementations
├── services // The standalone services (Database service, Email service, ...)
└── views // The view rendered by the server to the client (e.g. Jade, EJS, ...)
앱.js
의 app.js
파일은 expressjs 응용 프로그램을 부트스트랩하기 위한 것입니다.구성 모듈, 로거 모듈을 로드하고 데이터베이스 연결을 대기하며 ... 고속 서버를 실행합니다.
'use strict';
require('./config');
var database = require('./services/database');
var express = require('express');
var app = express();
module.exports = app;
function main() {
var http = require('http');
// Configure the application.
app.configure(function () {
// ... ... ...
});
app.configure('production', function () {
// ... ... ...
});
app.configure('development', function () {
// ... ... ...
});
var server = http.createServer(app);
// Load all routes.
require('./routes')(app);
// Listen on http port.
server.listen(3000);
}
database.connect(function (err) {
if (err) {
// ...
}
main();
});
경로/
에는 " 경디리에다있다니습음"가.index.js
안에 다른 하는 것입니다. 그것의 목표는 내부에 다른 모든 파일을 로드하는 일종의 마법을 도입하는 것입니다.routes/
디렉토리입니다.구현은 다음과 같습니다.
/**
* This module loads dynamically all routes modules located in the routes/
* directory.
*/
'use strict';
var fs = require('fs');
var path = require('path');
module.exports = function (app) {
fs.readdirSync('./routes').forEach(function (file) {
// Avoid to read this current file.
if (file === path.basename(__filename)) { return; }
// Load the route file.
require('./' + file)(app);
});
};
이 모듈을 사용하면 새 경로 정의 및 구현을 쉽게 만들 수 있습니다.를 들면, 예를들어,,hello.js
:
function hello(req, res) {
res.send('Hello world');
}
module.exports = function (app) {
app.get('/api/hello_world', hello);
};
각 경로 모듈은 독립형입니다.
저는 그것이 그것을 하는 좋은 방법이라고 생각합니다.express에 국한되지는 않지만 github에서 동일한 작업을 수행하는 node.js 프로젝트를 꽤 많이 보았습니다.구성 매개 변수 + 더 작은 모듈(경우에 따라 모든 URI)이 별도의 파일에 포함됩니다.
아이디어를 얻기 위해 github에 대한 특별한 프로젝트를 거치는 것을 추천합니다.IMO는 당신이 하는 방식이 맞습니다.
저는 기능 등을 내보내는 것보다 글로벌 "앱"을 사용하는 것을 좋아합니다.
3년 동안 제 구조를 개발하고 크고 작은 프로젝트에서 지금은 2015년 말입니다.결론?
하나의 큰 MVC를 수행하지 않고 모듈로 분리합니다.
그래서...
왜요?
일반적으로 하나는 하나의 모듈(예: 제품)에서 작동하며, 사용자는 이 모듈을 개별적으로 변경할 수 있습니다.
모듈을 재사용할 수 있습니다.
별도로 테스트할 수 있습니다.
별도로 교체할 수 있습니다.
명확한(안정적인) 인터페이스를 갖추고 있습니다.
-최소한 여러 명의 개발자가 작업하는 경우 모듈 분리가 도움이 됩니다.
노드 부트스트랩 프로젝트는 제 최종 구조와 유사한 접근 방식을 가지고 있습니다.(github)
이 구조물은 어떻게 생겼습니까?
소형 캡슐형 모듈(각각 별도의 MVC 포함)
각 모듈에는 패키지가 있습니다.제이손
구조물의 일부로서 테스트(각 모듈에서)
글로벌 구성, 라이브러리 및 서비스
통합 도커, 클러스터, 영원히
폴더 개요(모듈은 lib 폴더 참조):
MVC 스타일의 폴더 구조를 알려드립니다. 아래를 참조하십시오.
우리는 크고 중간 규모의 웹 애플리케이션을 위해 아래 폴더 구조를 사용했습니다.
myapp
|
|
|____app
| |____controllers
| | |____home.js
| |
| |____models
| | |___home.js
| |
| |____views
| |___404.ejs
| |___error.ejs
| |___index.ejs
| |___login.ejs
| |___signup.ejs
|
|
|_____config
| |___auth.js
| |___constants.js
| |___database.js
| |___passport.js
| |___routes.js
|
|
|____lib
| |___email.js
|
|____node_modules
|
|
|____public.js
| |____css
| | |__style.css
| |
| |____js
| | |__script.js
| |
| |____img
| | |__img.jpg
| |
| |
| |____uploads
| |__img.jpg
|
|
|
|_____app.js
|
|
|
|_____package.json
나는 생성 express mvc folder structurer을 위한 npm 모듈을 하나 만들었습니다.
아래의 https://www.npmjs.com/package/express-mvc-generator 을 찾으십시오.
이 모듈을 생성하고 사용하기 위한 간단한 단계입니다.
module 설듈모npm install express-mvc-generator -g
옵션 ii) 옵션확인express -h
express structure iii) express mvc express myapp
iv) 설치 종속성:npm install
:
config/database.js를 여십시오. 몽고브를 구성하십시오.
) 실행하기node app
또는nodemon app
vii)URL http://localhost:8042/signup 또는 http://yourip:8042/signup 확인
구성에 경로를 추가하는 것은 좋은 방법이 아니라고 생각합니다.더 나은 구조는 다음과 같습니다.
application/
| - app.js
| - config.js
| - public/ (assets - js, css, images)
| - views/ (all your views files)
| - libraries/ (you can also call it modules/ or routes/)
| - users.js
| - products.js
| - etc...
따라서 products.js 및 users.js에는 모든 경로가 포함됩니다.
이 질문에 대한 마지막 답변이 나온 지 꽤 오래되었으며 Express도 최근에 앱 구조를 구성하는 데 유용한 몇 가지 사항을 추가한 버전 4를 릴리스했습니다.
아래는 Express 앱을 구성하는 방법에 대한 모범 사례에 대한 최신 블로그 게시물입니다.http://www.terlici.com/2014/08/25/best-practices-express-structure.html
기사에 있는 조언을 적용한 깃허브 저장소도 있습니다.항상 최신 Express 버전으로 최신 상태입니다.
https://github.com/terlici/://github.com/terlici/base-express
음, 저는 제 경로를 처음에 읽은 json 파일로 넣었고, app.js의 for-loop에 경로를 설정했습니다.route.json에 됩니다.
이것은 많은 단순한 경우에 사용할 수 있지만 특별한 경우를 위해 몇 가지 경로를 수동으로 만들어야 했습니다.
저는 이 문제에 대해 정확히 게시물을 작성했습니다.으로 기적으다사용다니합음을로본▁a▁of다▁use▁makes▁it니▁basically를 사용합니다.routeRegistrar
은 폴의파일통반다니 폴더의 을 통해 됩니다./controllers
을 그것의기부르기을능라고 부르기init
.기능.init
을 app
변수를 매개 변수로 사용하여 원하는 방식으로 경로를 등록할 수 있습니다.
var fs = require("fs");
var express = require("express");
var app = express();
var controllersFolderPath = __dirname + "/controllers/";
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
if(controllerName.indexOf("Controller.js") !== -1){
var controller = require(controllersFolderPath + controllerName);
controller.init(app);
}
});
app.listen(3000);
이것은 관심이 있을 수 있습니다.
https://github.com/flatiron/nconf
파일, 환경 변수, 명령줄 인수 및 원자 개체 병합을 사용하는 계층적 node.js 구성입니다.
http://locomotivejs.org/ 은 Node.js 및 Express로 구축된 앱을 구성하는 방법을 제공합니다.
웹 사이트에서:
"로코모티브는 Node.js를 위한 웹 프레임워크입니다.Rocomotive는 MVC 패턴, RESTful 경로 및 구성을 통한 컨벤션을 지원하는 동시에 모든 데이터베이스 및 템플릿 엔진과 완벽하게 통합됩니다.Express를 기반으로 하는 Rocomotive는 Node에서 기대하는 힘과 단순성을 유지합니다."
Express 프로젝트 파일 시스템은 다음과 같습니다.
/ ...
/lib
/node_modules
/public
/views
app.js
config.json
package.json
app.js - 글로벌 앱 컨테이너
모듈 기본 파일(lib/mymodule/index.js):
var express = require('express');
var app = module.exports = express();
// and load module dependencies ...
// this place to set module settings
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');
// then do module staff
app.get('/mymodule/route/',function(req,res){ res.send('module works!') });
메인 app.js의 모듈 연결
...
var mymodule = require('mymodule');
app.use(mymodule);
샘플 논리
lib/login
lib/db
lib/config
lib/users
lib/verify
lib/
/api/
...
lib/
/admin/
/users/
/settings/
/groups/
...
- 테스트에 최적
- 확장성에 가장 적합
- 모듈별로 구분
- 기능별로 경로 그룹화) 경로 그룹화
tj는 Vimeo에서 Node.js 및 Express를 사용하는 모듈식 웹 애플리케이션인 익스프레스 애플리케이션을 모듈화하는 방법에 대해 말하고/보여줍니다.강력하고 단순합니다.
저는 최근 모듈을 독립적인 미니 앱으로 채택했습니다.
|-- src
|--module1
|--module2
|--www
|--img
|--js
|--css
|--#.js
|--index.ejs
|--module3
|--www
|--bower_components
|--img
|--js
|--css
|--#.js
|--header.ejs
|--index.ejs
|--footer.ejs
이제 모든 모듈 라우팅(#.js)에 대해 뷰(*.ejs), js, css 및 자산이 서로 옆에 있습니다. 하위 모듈 라우팅은 두 개의 추가 라인으로 부모 #.js에 설정됩니다.
router.use('/module2', opt_middleware_check, require('./module2/#'));
router.use(express.static(path.join(__dirname, 'www')));
이렇게 하면 하위 하위 모듈도 가능합니다.
src 디렉터리에 보기를 설정하는 것을 잊지 마십시오.
app.set('views', path.join(__dirname, 'src'));
sails.js 구조는 저에게 멋지고 깨끗해 보여서 저는 sails.js와 유사하게 익스프레스 프로젝트에 MVC 스타일의 구조를 사용합니다.
project_root
|
|_ _ app
|_ _ |_ _ controllers
|_ _ |_ _ |_ _ UserController.js
|_ _ |_ _ middlewares
|_ _ |_ _ |_ _ error.js
|_ _ |_ _ |_ _ logger.js
|_ _ |_ _ models
|_ _ |_ _ |_ _ User.js
|_ _ |_ _ services
|_ _ |_ _ |_ _ DatabaseService.js
|
|_ _ config
|_ _ |_ _ constants.js
|_ _ |_ _ index.js
|_ _ |_ _ routes.js
|
|_ _ public
|_ _ |_ _ css
|_ _ |_ _ images
|_ _ |_ _ js
|
|_ _ views
|_ _ |_ _ user
|_ _ |_ _ |_ _ index.ejs
앱 폴더 - 응용 프로그램에 대한 전체 로그인을 포함합니다.
구성 폴더 - 앱 구성, 상수, 경로를 포함합니다.
공용 폴더 - 스타일, 이미지, 스크립트 등을 포함합니다.
뷰 폴더 - 각 모델에 대한 뷰(있는 경우)를 포함합니다.
여기에서 수 .
https://github.com/abdulmoiz251/://github.com/abdulmoiz251/node-express-rest-api-boilerplate
이것이 제 익스프레스 프로젝트 디렉토리 구조의 대부분입니다.
는나보를 .express dirname
프로젝트를 초기화하기 위해, 나의 게으름을 용서하십시오. 하지만 그것은 매우 유연하고 확장 가능합니다. PS - 당신은 받아야 합니다.express-generator
(찾는 sudo npm install -g express-generator
sudo를 사용합니다.
|-- bin
|-- www //what we start with "forever"
|-- bower_components
|-- models
|-- database.js
|-- model1.js //not this exact name ofcourse.
|-- .
|-- node_modules
|-- public
|-- images
|-- javascripts
|-- controllers
|-- directives
|-- services
|-- app.js
|-- init.js //contains config and used for initializing everything, I work with angular a lot.
|-- stylesheets
|-- routes
|-- some
|-- hierarchy
.
.
|-- views
|-- partials
|-- content
|-- .env
|-- .env.template
|-- app.js
|-- README.md
.파일이 왜 있는지 입니다.env 파일이 왜 있는지 궁금하실 거예요?그들은 일하니까요!사용합니다dotenv
내 프로젝트의 모듈(최근에 많이) 그리고 그것은 작동합니다. 개의문위표시에치음에 이 두 .app.js
또는www
var dotenv = require('dotenv');
dotenv.config({path: path.join(__dirname + "/.env")});
설정할 수 또 야 다 또 라 인 할 리/bower_components
리스아래정제콘다니공합를텐츠적서에에서 정적인 를 제공합니다./ext
app.use('/ext', express.static(path.join(__dirname, 'bower_components')));
함께 , Express와 Angular를 사용하려는 사람들에게 할 수도 .javascripts
물론 위계질서.
나의 구조 익스프레스 4. https://github.com/odirleiborgert/borgert-express-boilerplate
패키지
View engine: twig
Security: helmet
Flash: express-flash
Session: express-session
Encrypt: bcryptjs
Modules: express-load
Database: MongoDB
ORM: Mongoose
Mongoose Paginate
Mongoose Validator
Logs: winston + winston-daily-rotate-file
Nodemon
CSS: stylus
Eslint + Husky
구조.
|-- app
|-- controllers
|-- helpers
|-- middlewares
|-- models
|-- routes
|-- services
|-- bin
|-- logs
|-- node_modules
|-- public
|-- components
|-- images
|-- javascripts
|-- stylesheets
|-- views
|-- .env
|-- .env-example
|-- app.js
|-- README.md
익스프레스 앱을 구성하는 간단한 방법:
main index.js에서는 다음 순서를 유지해야 합니다.
올앱.집합이 먼저여야 합니다.
모든 app.use는 두 번째가 되어야 합니다.
그 뒤에 다른 파일의 기능이나 경로 추적 기능이 있는 다른 아피스가 있습니다.
예제
app.use("/password", passwordApi);
app.use("/user", userApi);
app.post passport/passport", passport.create토큰);
app.post passport/logout", passport.logout)
핸들바와 Passportjs를 사용한 ExpressJs 프로젝트의 MVC 구조로 가는 최선의 방법
- app
-config
-passport-setup.js
-controllers
-middleware
-models
-routes
-service
-bin
-www
-configuration.js
-passport.js
-node_modules
-views
-handlebars page
-env
-.gitignore
-package.json
-package-lock.json
언급URL : https://stackoverflow.com/questions/5778245/expressjs-how-to-structure-an-application
'programing' 카테고리의 다른 글
ubuntu에서 postgresql을 완전히 제거하고 다시 설치하는 방법은 무엇입니까? (0) | 2023.06.02 |
---|---|
오류: psycopg2라는 모듈이 없습니다.내선 번호 (0) | 2023.06.02 |
OnActivityResult 메서드는 더 이상 사용되지 않습니다. 대안은 무엇입니까? (0) | 2023.06.02 |
이름/값 쌍이 있는 Excel 드롭다운 (0) | 2023.06.02 |
alias 또는 alias_method를 사용해야 합니까? (0) | 2023.06.02 |