노드 JS 및 Express 기본 사항(III). Node JS 및 Express 기본 사항(III) 읽기 참고 사항: READ Route




  • 번역

새로운 프로그래머에게 Node.js 개발은 악몽처럼 보일 수 있습니다. 그 원인은 플랫폼의 유연성과 명확한 지침이 부족하다는 것입니다. 그러나 사실 모든 것이 그렇게 무섭지는 않습니다.


예를 들어, 다음은 애플리케이션의 서버 부분인 REST API를 개발하는 일반적인 작업입니다. Node의 풍부한 자체 기능과 이 문제를 해결하는 데 도움이 될 수 있는 많은 추가 모듈은 선택의 폭이 넓기 때문에 초보자를 막다른 골목으로 이끌 수 있습니다. 여기서 주요 문제는 구성 요소 선택과 함께 작동하는 방식입니다.

서버 측 애플리케이션을 생성하는 한 가지 방법은 Node.js, Express 프레임워크 및 MongoDB DBMS를 조합하여 사용하는 것입니다. 실제로 오늘 저는 거의 모든 애플리케이션의 기반이 될 수 있는 작동하는 API 모형을 만드는 방법에 대해 이야기하겠습니다. 여기서는 기본 REST 경로를 구현하고, HTTP를 통해 API와 상호 작용하고, 간단한 데이터베이스 옵션을 사용합니다.

이 자료를 성공적으로 마스터하려면 REST API가 무엇인지 이해하고, CRUD 작업에 대해 이해하고, JavaScript에 대한 기본 지식이 있어야 합니다. 저는 여기서 ES6을 사용하고 있습니다. 너무 복잡하지는 않으며 대부분 화살표 기능입니다.

Google Keep과 유사한 메모 작성 앱을 위한 백엔드 뼈대를 개발할 것입니다. 이 경우 메모를 사용하여 생성, 읽기, 업데이트 및 삭제의 네 가지 CRUD 작업을 모두 수행할 수 있습니다.

사전 준비

아직 Node가 없다면 지금이 Node를 설치할 때입니다. 설치 후 폴더를 만들고 명령을 실행하여 폴더에서 새 프로젝트를 초기화합니다.

NPM 초기화
초기화하는 동안 질문에 답하십시오. 특히 애플리케이션에 "주목할만한" 이름(또는 원하는 경우 다른 이름)을 지정하십시오.

이제 파일이 폴더에 나타납니다. 패키지.json. 이는 프로젝트가 의존하는 추가 패키지 설치를 시작할 수 있음을 의미합니다.

우리는 Express를 프레임워크로 사용할 계획입니다. 데이터베이스 관리 시스템은 MongoDB입니다. 또한 JSON 작업을 위한 보조 도구로 body-parser 패키지를 사용합니다. 다음을 모두 설치해 보겠습니다.

Npm install --express mongodb body-parser 저장
또한 Nodemon을 개발 종속성으로 설치하는 것이 좋습니다. 파일이 변경되면 자동으로 서버를 다시 시작하는 간단하고 작은 패키지입니다.

이 패키지를 설치하려면 다음 명령을 실행하십시오.

Npm install --save-dev nodemon
그런 다음 파일에 다음 스크립트를 추가할 수 있습니다. 패키지.json:

// package.json "scripts": ("dev": "nodemon server.js" ),
준비가 된 패키지.json다음과 같이 보일 것입니다 :

// package.json ( "name": "notable", "version": "1.0.0", "description": "", "main": "server.js", "scripts": ( "dev": "nodemon server.js", "author": "", "license": "ISC", "종속성": ( "body-parser": "^1.15.2", "express": "^4.14.0 " , "mongodb": "^2.2.16" ), "devDependency": ( "nodemon": "^1.11.0" ) )
이제 파일을 만들어보자 server.js API 작업을 시작해 보겠습니다.

섬기는 사람

파일의 종속성을 연결하는 것부터 시작하겠습니다. server.js.

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const 앱 = 표현();
MongoClient를 사용하여 데이터베이스와 상호 작용합니다. 또한 여기에서는 Express 프레임워크의 인스턴스를 사용하여 애플리케이션을 상징하는 앱 상수를 초기화합니다. 서버가 작동하려면 애플리케이션에 HTTP 요청 수신 대기를 시작하라고 지시하는 것만 남아 있습니다.

여기서는 포트를 지정하고 다음과 같이 수신을 시작합니다.

// server.js const 포트 = 8000; app.listen(포트, () =>
이제 npm run dev(또는 Nodemon을 설치하지 않은 경우 node server.js) 명령을 실행하면 터미널에 "We are live on port 8000"이라는 메시지가 나타납니다.

그래서 서버가 실행 중입니다. 그러나 이제 그는 전혀 유용한 일을 하지 않습니다. 이것을 알아 봅시다.

CRUD 작업을 대상으로 하는 경로

4개의 경로를 만들 계획입니다. 즉:
  • CREATE – 노트를 생성합니다.
  • 읽기 - 메모를 읽습니다.
  • 업데이트 – 메모를 업데이트합니다.
  • 삭제—메모를 삭제합니다.
이 체계를 익히면 Node를 사용하여 필요한 거의 모든 REST 경로를 구성하는 방법을 이해할 수 있습니다.

API를 테스트하려면 애플리케이션 클라이언트 측의 요청을 시뮬레이션할 수 있는 것이 필요합니다. Postman이라는 훌륭한 프로그램이 이 문제를 해결하는 데 도움이 될 것입니다. 이를 통해 주어진 본문과 매개변수를 사용하여 간단한 HTTP 요청을 수행할 수 있습니다.

포스트맨을 설치합니다. 이제 경로를 구성할 모든 준비가 완료되었습니다.

프로젝트 구조 정보

대부분의 Node.js 튜토리얼(및 많은 실제 애플리케이션)은 모든 경로를 하나의 큰 파일에 배치합니다. Route.js. 나는 이 접근법을 별로 좋아하지 않는다. 파일을 다른 폴더에 구성하면 코드의 가독성이 향상되고 애플리케이션 관리가 더 쉬워집니다.

우리의 응용 프로그램은 크다고 할 수는 없지만 적당한 규모를 고려하여 모든 작업을 수행할 것을 제안합니다. 다음 폴더를 생성합니다: 폴더 , 그리고 그 안에 - 노선. 폴더 내 노선파일 생성 index.js그리고 note_routes.js. 즉, 프로젝트 구조는 다음과 같습니다. 루트 > 앱 > 경로 > index.js그리고 note_routes.js.

Mkdir 앱 cd 앱 mkdir 경로 CD 경로 touch index.js touch note_routes.js
이 구조는 소규모 애플리케이션에서는 중복되는 것처럼 보일 수 있지만, 우리 예제를 기반으로 구축된 대규모 시스템에서는 매우 유용할 것입니다. 또한 기존의 모범 사례를 사용하여 프로젝트를 시작하는 것이 가장 좋습니다.

메모 만들기: 경로 만들기

CREATE 경로부터 시작하겠습니다. 이를 위해 "메모를 만드는 방법"이라는 질문에 답하겠습니다.
노트 작성을 시작하기 전에 애플리케이션의 인프라를 확장해야 합니다. Express에서 경로는 Express 인스턴스와 데이터베이스를 인수로 사용하는 함수로 래핑됩니다.

다음과 같이 보일 수 있습니다:

// 경로/note_routes.js module.exports = function(app, db) ( );
이제 다음을 통해 이 기능을 내보낼 수 있습니다. index.js:

// 경로/index.js const noteRoutes = require("./note_routes"); module.exports = function(app, db) ( noteRoutes(app, db); // 나중에 여기에 다른 경로 핸들러가 있을 것입니다 );
우리는 우리가 얻은 것을 수입합니다 server.js:

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const 앱 = 표현(); const 포트 = 8000; require("./app/routes")(app, ()); app.listen(port, () => ( console.log("우리는 " + port)에서 라이브 중입니다; ));
아직 데이터베이스를 구성하지 않았으므로 빈 개체가 두 번째 인수로 전달됩니다.

이제 CREATE 경로를 생성합니다. 여기의 구문은 매우 간단합니다.

Module.exports = function(app, db) ( app.post("/notes", (req, res) => ( // 여기에 메모를 생성합니다. res.send("Hello") )); );
애플리케이션이 '/notes' 경로를 통해 POST 요청을 수신하면 콜백 함수 내에서 코드를 실행하여 요청 개체(요청 매개변수 또는 JSON 데이터 포함)와 응답 개체(물론 응답에 사용됩니다).

우리가 달성한 것은 이미 테스트될 수 있습니다. Postman을 사용하여 해당 주소로 POST 요청을 보내겠습니다. 로컬호스트:8000/메모.


요청에 대한 응답은 "Hello"여야 합니다.

엄청난. 첫 번째 경로가 생성되었습니다. 다음 단계는 요청에 매개변수를 추가하고 API에서 처리한 후 마지막으로 데이터베이스에 메모를 저장하는 것입니다.

요청 매개변수

Postman에서 탭으로 이동 라디오 버튼을 선택하여 여러 키-값 쌍을 추가합니다. x-www-form-urlencoded. 즉, 첫 번째 키는 제목, 그 값은 내 노트 제목. 두 번째 열쇠 - , 그 값은 정말 좋은 메모네요.

이렇게 하면 API에서 처리할 수 있는 요청에 인코딩된 데이터가 추가됩니다.


내 노트의 제목과 게시물 자체는 매우 간단하지만 여기서는 여러분의 상상력을 보여줄 수 있습니다.

파일에 있음 note_route.js, 메모 본문을 콘솔에 인쇄하면 됩니다.

// note_routes.js module.exports = function(app, db) ( app.post("/notes", (req, res) => ( console.log(req.body) res.send("Hello") ) );
Postman을 사용하여 요청을 보내면... 정의되지 않음이 표시됩니다.

불행하게도 Express는 URL 인코딩된 양식을 자체적으로 처리할 수 없습니다. 여기서는 이전에 설치된 body-parser 패키지가 도움이 될 것입니다.

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const 앱 = 표현(); const 포트 = 8000; app.use(bodyParser.urlencoded(( 확장: true ))); require("./app/routes")(app, ()); app.listen(port, () => ( console.log("우리는 " + port)에서 라이브 중입니다; ));
이제 POST 요청을 실행한 후 해당 요청의 본문이 터미널에 객체로 표시될 수 있습니다.

( title: "내 노트 제목", body: "정말 훌륭한 노트입니다." )
첫 번째 경로가 완전히 작동하려면 데이터베이스를 구성하고 메모를 추가하는 것만 남아 있습니다.

데이터베이스를 빠르게 생성하고 구성하기 위해 mLab 서비스를 사용하겠습니다. 작업하기 쉽고 소량의 정보에 대해서는 무료입니다.

mLab 웹사이트에서 계정을 생성하고 새로운 MongoDB 데이터베이스를 배포하세요. 이렇게 하려면 버튼을 클릭하세요. 만들다 새로운장에서 MongoDB 배포, 나타나는 창의 섹션에서 계획, 선택하다 단일 노드. 목록에 표준선, 선택하다 모래 상자데이터베이스에 이름을 지정합니다. 다음으로 데이터베이스 관리 창에서 탭으로 이동합니다. 사용자사용자 이름과 비밀번호를 지정하여 데이터베이스 사용자를 추가합니다.


새로운 데이터베이스 사용자

동일한 페이지에서 두 번째 URL(데이터베이스 연결 문자열)을 복사합니다.


데이터베이스에 연결하기 위한 URL

프로젝트 루트에 디렉터리 추가 구성, 그 안에 파일을 생성하세요 db.js.

Mkdir 구성 CD 구성 터치 db.js
파일로 db.js다음을 추가하세요:

Module.exports = (url: 귀하의 URL이 여기에 표시됩니다);
URL에 사용자 이름과 비밀번호를 추가하는 것을 잊지 마세요(mLab 계정용이 아니라 데이터베이스용으로 생성한 비밀번호). Github에서 프로젝트를 호스팅하는 경우 파일을 포함해야 합니다. .gitignore(이와 같이). 이렇게 하면 데이터베이스 작업에 필요한 이름과 비밀번호를 공개하지 않게 됩니다.

지금에 server.js, MongoClient를 사용하여 데이터베이스에 연결하고 생성 시 전달되는 함수에 애플리케이션 설정을 래핑할 수 있습니다.

// server.js const express = require("express"); const MongoClient = require("mongodb").MongoClient; const bodyParser = require("body-parser"); const db = require("./config/db"); const 앱 = 표현(); const 포트 = 8000; app.use(bodyParser.urlencoded(( 확장: true ))); MongoClient.connect(db.url, (err, 데이터베이스) => ( if (err) return console.log(err) require("./app/routes")(app, 데이터베이스); app.listen(port, ( ) => ( console.log("우리는 " + 포트에서 라이브 중입니다); ));
이로써 인프라 준비가 완료되었습니다. 이제부터는 경로만 다루겠습니다.

데이터베이스에 레코드 추가

MongoDB는 이름에 걸맞는 컬렉션에 데이터를 저장합니다. 우리의 경우, 메모는 추측할 수 있듯이 Notes 라고 불리는 컬렉션에 저장됩니다.

클라이언트 설정 중에 데이터베이스 연결 문자열인 db 인수가 제공되었습니다. 경로 코드에서 다음과 같이 데이터베이스에 액세스할 수 있습니다.

Db.collection("메모")
데이터베이스에 메모를 생성하는 것은 메모 컬렉션에 대한 삽입 명령을 호출하는 것과 같습니다.

Const note = ( 텍스트: req.body.body, 제목: req.body.title) db.collection("notes").insert(note, (err, results) => ( )
명령이 성공적으로 완료된 후(또는 어떤 이유로 실행할 수 없는 경우) 응답으로 새로 생성된 메모 개체를 보내거나 오류 메시지를 보내야 합니다. 코드는 다음과 같습니다. note_routes.js, 다음 고려 사항을 고려하여 보완되었습니다.

// note_routes.js module.exports = function(app, db) ( app.post("/notes", (req, res) => ( const note = ( 텍스트: req.body.body, 제목: req.body .title ); db.collection("notes").insert(note, (err, result) =>
당신이 얻는 것을 시험해보십시오. Postman에서 POST 요청 보내기(플래그 포함) x-www-form-urlencoded), 탭에서 설정하여 필드 값 제목그리고 .

대답은 다음과 같아야 합니다.


데이터베이스에 레코드를 성공적으로 추가했습니다.

독서 노트: READ Route

위에서 준비한 인프라는 모든 경로에 적합하므로 이제 작업이 더 빨라질 것입니다.

따라서 경로를 따라 방금 생성한 메모를 쿼리해 보겠습니다. localhost:8000/notes/(노트 ID). 우리의 경우 경로는 다음과 같습니다. localhost:8000/notes/585182bd42ac5b07a9755ea3.

이미 생성된 노트 중 하나의 ID가 없는 경우 mLab의 데이터베이스를 조사하여 찾거나 새 노트를 생성하고 해당 ID를 복사할 수 있습니다.

이것이 다음과 같이 보입니다. note_route.js:

// note_routes.js module.exports = function(app, db) ( app.get("/notes/:id", (req, res) => ( )); app.post("/notes", (req , res) => ( const note = ( 텍스트: req.body.body, 제목: req.body.title ); db.collection("notes").insert(note, (err, result) => ( if ( err) ( res.send(( "error": "오류가 발생했습니다." )); ) else ( res.send(result.ops); ) ));
이전과 마찬가지로 Notes 데이터베이스 컬렉션에 대해 몇 가지 명령을 호출하겠습니다. 이를 위해 findOne 메소드를 사용해 보겠습니다.

// note_routes.js module.exports = function(app, db) ( app.get("/notes/:id", (req, res) => ( const 세부 정보 = ( "_id":<ТУТ БУДЕТ ID>); db.collection("notes").findOne(details, (err, item) => ( if (err) ( res.send(("error":"오류가 발생했습니다")); ) else ( res.send (안건); ))); app.post("/notes", (req, res) => ( const note = ( text: req.body.body, title: req.body.title ); db.collection("notes").insert(note , (err, result) => ( if (err) ( res.send(( "error": "오류가 발생했습니다" )); ) else ( res.send(result.ops); ) )) ; );
req.params.id 구성을 사용하여 URL 매개변수에서 식별자를 추출할 수 있습니다. 그러나 단순히 대신에 줄을 삽입하면<<>> 위의 코드에서는 작동하지 않습니다.

MongoDB에서는 ID가 문자열이 아닌 특수 개체로 필요합니다. 그것은이라고 개체 ID.

약간의 변경을 거쳐 얻은 결과는 다음과 같습니다.

// note_routes.js var ObjectID = require("mongodb").ObjectID; module.exports = function(app, db) ( app.get("/notes/:id", (req, res) => ( const id = req.params.id; const 세부정보 = ( "_id": 새 ObjectID (id) ); db.collection("notes").findOne(details, (err, item) => ( if (err) ( res.send(("error":"오류가 발생했습니다.")); ) else ( res.send(item); ) )); app.post("/notes", (req, res) => ( const note = ( 텍스트: req.body.body, 제목: req.body .title ) ; db.collection("notes").insert(note, (err, result) => ( if (err) ( res.send(( "error": "오류가 발생했습니다" )); ) else ( res. 보내기(결과.ops) ) ));
데이터베이스에서 사용 가능한 노트 ID 중 하나로 이를 시도해 보세요. Postman의 응답은 다음과 같아야 합니다.


데이터베이스에서 메모 요청 성공

메모 삭제 중: 경로 삭제

객체를 삭제하는 것은 데이터베이스에서 객체를 검색하는 것과 실질적으로 동일합니다. findOne 함수 대신 Remove 함수만 사용됩니다. 다음은 해당 경로에 대한 전체 코드입니다. 이는 GET 요청을 처리하는 기존 메서드의 코드와 다른 점을 강조합니다.

// note_routes.js // ... app.delete("/notes/:id", (req, res) => ( const id = req.params.id; const 세부정보 = ( "_id": new ObjectID( id) ); db.collection("notes").remove(details, (err, item) => ( if (err) ( res.send(("error":"오류가 발생했습니다")); ) else ( res.send("Note " + id + " 삭제되었습니다!"); ) )); // ...

메모 업데이트: 업데이트 경로

그리고 여기가 마지막 경로입니다. PUT 요청 처리는 기본적으로 READ 및 CREATE 작업의 혼합입니다. 먼저 객체를 찾은 다음 요청에서 받은 데이터에 따라 객체를 업데이트해야 합니다. 이제 이전 코드 조각을 테스트하는 동안 유일한 메모를 삭제했다면 다른 메모를 만드세요.

메모 업데이트 경로 코드는 다음과 같습니다.

// note_routes.js // ... app.put ("/notes/:id", (req, res) => ( const id = req.params.id; const 세부정보 = ( "_id": new ObjectID( id) ); const note = ( 텍스트: req.body.body, 제목: req.body.title ) db.collection("notes").update(details, note, (err, result) => ( if ( err) ( res.send(("error":"오류가 발생했습니다.")); ) else ( res.send(note); ) )); // ...
이제 모든 메모를 편집할 수 있습니다. 그 모습은 다음과 같습니다.


노트 업데이트 성공

우리 예제의 결함을 주목하세요. PUT 요청에 메모의 본문이나 제목이 포함되어 있지 않으면 데이터베이스의 해당 필드가 지워집니다.

추가 확인을 통해 예제를 로드하지 않았습니다. 원하는 경우 메모 업데이트 작업을 직접 수정하여 요청이 올바르게 구성된 경우에만 데이터베이스에 새 데이터를 추가할 수 있습니다.

결과

이제 네 가지 기본 CRUD 작업을 지원하는 작동 중인 Node API가 생겼습니다. 애플리케이션의 서버 부분은 클라이언트 HTTP 요청에 응답하고, 데이터베이스에 메모를 생성하고, 찾고, 삭제하고, 편집할 수 있습니다.

내 이야기의 주요 목표는 모든 사람에게 Node + Express + MongoDB 조합과 서버 애플리케이션 개발 방법론을 소개하는 것입니다. 물론 오늘 이러한 도구를 처음 접하는 경우 모든 것을 더 잘 이해하려면 설명서를 읽어야 합니다. 그러나 무슨 일이 일어나고 있는지 이해하면 지식의 격차를 빠르게 메우고 여기서 작업하고 있는 애플리케이션을 출발점으로 사용하여 자신의 프로젝트 작업을 시작할 수 있습니다.

실제 프로젝트에서 Node.js, Express, MongoDB를 사용해본 경험이 있다면 초보자를 위한 조언이 있나요? 이 모든 것을 처음으로 시도하셨다면, 우리는 귀하의 소감을 기다리고 있습니다.

$ npm 익스프레스 설치

또는 express 명령에 액세스하려면 전역으로 설치하십시오.

$ npm 설치 -g 익스프레스

빠른 시작

Express를 시작하는 가장 쉬운 방법은 애플리케이션을 생성하는 express 명령을 실행하는 것입니다.

애플리케이션 생성:

$ npm install -g express $ express /tmp/foo && cd /tmp/foo

종속성 설치:

$ npm 설치 -d

서버 시작:

서버 생성

express.HTTPServer의 인스턴스를 생성하려면 createServer() 메서드를 호출하기만 하면 됩니다. 애플리케이션 인스턴스를 사용하면 HTTP 메서드(이 예에서는 app.get() )를 기반으로 경로를 지정할 수 있습니다.

var app = require("express").createServer(); app.get("/", function(req, res)( res.send("hello world"); )); app.listen(3000);

HTTPS 서버 생성

express.HTTPSServer 를 초기화하기 위해 위와 동일한 단계를 수행하지만 NodeJS https 모듈 문서에 설명된 키, 인증서 및 기타 매개 변수가 포함된 옵션 개체도 전달합니다.

var app = require("express").createServer(( 키: ... ));

구성

Express는 프로덕션, 개발 등 임의의 환경을 지원합니다. 개발자는 configure() 메서드를 사용하여 특정 환경에 필요한 기능을 추가할 수 있습니다. 환경 이름 없이 configure()가 호출되면 해당 환경이 지정된 구성이 실행되기 전에 모든 환경에서 실행됩니다.

아래 예에서는 단순히 dumpExceptions 옵션을 사용하고 개발 모드에서는 예외의 스택 추적으로 클라이언트에 응답합니다. 두 모드 모두에서 methodOverride 및 bodyParser 레이어를 사용합니다. app.router 를 사용하면 경로 자체를 마운트할 수 있습니다. 그렇지 않으면 app.get() , app.post() 등이 처음 호출될 때 경로가 마운트됩니다.

app.configure(function())( app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(app.router); )); app.configure("development", function())( app.use(express.static(__dirname + "/public")); app.use(express.errorHandler(( dumpExceptions: true, showStack: true ))); ) ); app.configure("production", function())( var oneYear = 31557600000; app.use(express.static(__dirname + "/public", ( maxAge: oneYear ))); app.use(express.errorHandler() ) ;));

유사한 설정을 가진 환경의 경우 여러 환경 이름을 전달할 수 있습니다.

app.configure("stage", "prod", function())( // 구성 ));

내부 및 임의 설정의 경우 Express에는 set(key[, val]) , 활성화(key) , 비활성화(key) 메서드가 있습니다.

app.configure(function () ( app.set("views", __dirname + "/views"); app.set("views"); // => "/absolute/path/to/views" app.enable ("some feature"); // app.set("some feature", true); // app.set("some feature", false) 와 동일 .enabled("일부 기능") // => false ));

환경을 설정하기 위해 NODE_ENV 환경 변수를 설정할 수 있습니다. 예를 들어:

$ NODE_ENV=프로덕션 노드 app.js

많은 캐싱 메커니즘이 프로덕션 환경에서만 활성화되기 때문에 이는 매우 중요합니다.

설정

기본적으로 Express는 다음 설정을 지원합니다.

  • home은 마운트된 애플리케이션에 대한 투명한 지원뿐만 아니라 res.redirect()에도 사용되는 애플리케이션의 기본 경로입니다.
  • views는 뷰의 루트 디렉터리입니다. 기본적으로 current_folder/views
  • 뷰 엔진 - 파일 확장자 없이 호출되는 뷰에 대한 기본 템플릿 엔진입니다.
  • 보기 옵션 - 전역 보기 옵션을 반영하는 객체
  • 뷰 캐시 - 뷰 캐싱 활성화(프로덕션 환경에서 활성화됨)
  • 대소문자 구분 경로 - 대소문자 구분 경로 활성화
  • 엄격한 라우팅 - 활성화되면 후행 슬래시가 더 이상 무시되지 않습니다.
  • jsonp 콜백 - res.send() 메서드가 JSONP를 투명하게 지원하도록 허용

라우팅

Express는 HTTP 메소드를 사용하여 의미 있고 표현력이 풍부한 라우팅 API를 제공합니다. 예를 들어 /user/12를 검색하면 id=12인 사용자의 프로필이 표시되기를 원합니다. 이를 위해 아래 경로를 정의합니다. 명명된 필드와 관련된 값은 res.params 개체에서 사용할 수 있습니다.

app.get("/user/:id", function(req, res)( res.send("user " + req.params.id); ));

경로는 엔진 내부에서 정규식으로 컴파일되는 단순한 문자열입니다. 예를 들어, /user/:id가 컴파일되면 결과는 다음과 같은 정규식입니다.

\/사용자\/([^\/]+)\/?

정규식을 즉시 전달할 수도 있습니다. 그러나 그룹은 정규식으로 이름이 지정되지 않으므로 req.params에서 숫자로 접근할 수 있습니다. 따라서 첫 번째 그룹은 req.params로 이동하고 두 번째 그룹은 req.params로 이동합니다.

app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res)( res.send(req.params ); ));

이제 컬을 사용하여 위 경로로 요청을 보내겠습니다.

$ 컬 http://dev:3000/user $ 컬 http://dev:3000/users $ 컬 http://dev:3000/users/1 ["1",null] $ 컬 http://dev: 3000/사용자/1..15 ["1","15"]

다음은 일치할 수 있는 몇 가지 예시 경로 및 경로입니다.

"/user/:id" /user/12 "/users/:id?" /users/5 /users "/files/*" /files/jquery.js /files/javascripts/jquery.js "/file/*.*" /files/jquery.js /files/javascripts/jquery.js "/ 사용자/:id/:작업?" /user/1 /user/1/edit "/products.:format" /products.json /products.xml "/products.:format?" /products.json /products.xml /products "/user/:id.:format?" /사용자/12 /사용자/12.json

예를 들어 JSON 요청(및 기타 요청)을 구문 분석하고 응답을 req.body에 배치할 수 있는 bodyParser 레이어를 사용하여 일부 JSON을 POST하고 동일한 JSON으로 응답할 수 있습니다.

var express = require("express"), app = express.createServer(); app.use(express.bodyParser()); app.post("/", function(req, res) ( res.send(req.body); )); app.listen(3000);

일반적으로 제한이 없는 "멍청한" 필드(예: /user/:id)를 사용합니다. 그러나 예를 들어 사용자 ID를 숫자로만 제한하려면 /user/:id(+) 를 사용할 수 있습니다. 필드 값에 숫자가 아닌 문자가 포함되어 있으면 이 구성이 작동하지 않습니다.

제어권을 다른 경로로 이전

세 번째 인수인 next() 를 호출하면 다음 경로로 제어를 전달할 수 있습니다. 일치하는 항목이 없으면 제어가 Connect로 다시 전달되고 레이어는 use() 를 사용하여 활성화된 순서대로 계속 호출됩니다. 동일한 경로를 공유하는 여러 경로도 작동합니다. next() 를 호출하는 대신 그 중 하나가 응답할 때까지 한 번에 하나씩 호출됩니다.

app.get("/users/:id?", function(req, res, next) ( var id = req.params.id; if (id) ( // 뭔가를 하세요 ) else ( next(); ) )) ; app.get("/users", function(req, res) ( // 다른 작업 수행 ));

app.all() 메서드는 모든 HTTP 메서드에 대해 동일한 논리를 수행하려는 경우 유용합니다. 아래에서는 이 방법을 사용하여 데이터베이스에서 사용자를 검색하고 이를 req.user에 할당합니다.

var express = require("express"), app = express.createServer(); var users = [( 이름: "tj" )]; app.all("/user/:id/:op?", function(req, res, next) ( req.user = 사용자; if (req.user) ( next(); ) else ( next(new Error( "사용자를 찾을 수 없습니다" + req.params.id)); app.get("/user/:id", function(req, res) ( res.send("viewing " + req.user.name); )); app.get("/user/:id/edit", function(req, res) ( res.send("editing " + req.user.name); )); app.put("/user/:id", function(req, res) ( res.send("updating " + req.user.name); )); app.get("*", function(req, res) ( res.send("what???", 404); )); app.listen(3000);

중간층

Connect 프레임워크 레이어는 일반 Connect 서버가 사용되는 것과 동일한 방식으로 express.createServer()에 전달될 수 있습니다. 예를 들어:

var express = require("express"); var app = express.createServer(express.logger(), express.bodyParser());

use() 를 사용할 수도 있습니다. 이렇게 하면 구성() 블록 내부에 레이어를 추가하는 것이 더 편리해지며 이는 더욱 진보적입니다.

app.use(express.logger(( 형식: ":method:url" )));

일반적으로 Connect 레이어를 사용하면 다음과 같이 Connect를 연결할 수 있습니다.

var 연결 = require("연결"); app.use(connect.logger()); app.use(connect.bodyParser());

이는 완전히 편리하지 않으므로 Express는 Connect 레이어를 다시 내보냅니다.

app.use(express.logger()); app.use(express.bodyParser());

레이어의 순서가 중요합니다. 따라서 Connect가 요청을 받으면 createServer() 또는 use()를 통해 추가된 첫 번째 레이어가 실행됩니다. 요청, 응답, 콜백 함수(일반적으로 다음에 호출됨)라는 세 가지 매개변수로 호출됩니다. next()가 호출되면 제어가 두 번째 레이어로 전송됩니다. 많은 레이어가 서로 의존하기 때문에 이를 고려하는 것이 중요합니다. 예를 들어, methodOverride()는 req.body.method를 호출하여 HTTP 메서드를 오버로드하고 bodyParser()는 요청 본문을 구문 분석하여 req.body를 채웁니다. 또 다른 예는 쿠키 구문 분석 및 세션 지원입니다. 먼저 cookieParser() 에서 use() 를 호출한 다음 session() 에서 호출해야 합니다.

많은 Express 애플리케이션에는 app.use(app.router) 행이 있을 수 있습니다. 이상하게 보일 수도 있지만 이는 단순히 우리가 생성한 모든 경로를 포함하는 레이어를 명시적으로 지정하기 위한 것입니다. 이 레이어는 순서에 상관없이 포함될 수 있지만 기본적으로는 맨 마지막에 포함됩니다. 위치를 변경하여 실행 순서를 제어할 수 있습니다. 예를 들어, 다른 모든 레이어 이후에 실행되고 next()를 사용하여 전달된 모든 예외를 표시하는 오류 핸들러가 필요합니다. 또는 다른 경로가 해당 파일에 대한 요청을 가로채고 다운로드 수 등을 계산할 수 있도록 정적 파일을 제공하는 계층의 실행 순서를 낮춰야 할 수도 있습니다. 다음과 같이 보일 수 있습니다.

app.use(express.logger(...)); app.use(express.bodyParser(...)); app.use(express.cookieParser(...)); app.use(express.session(...)); app.use(app.router); app.use(express.static(...)); app.use(express.errorHandler(...));

먼저 logger()를 추가합니다. req.end() 메서드를 래핑하여 응답 속도 데이터를 제공합니다. 그런 다음 요청 본문(있는 경우), 쿠키, 세션을 구문 분석하므로 app.router의 경로에 도달할 때 req.session이 이미 정의되어 있습니다. 예를 들어 /javascripts/jquery.js에 대한 GET 요청이 경로에 의해 처리되고 next()를 호출하지 않으면 static() 계층은 해당 요청을 수신하지 않습니다. 그러나 아래와 같이 경로를 정의하면 통계 기록, 다운로드 거부, 다운로드 과금 등이 가능해집니다.

var 다운로드 = (); app.use(app.router); app.use(express.static(__dirname + "/public")); app.get("/*", function(req, res, next) ( var file = req.params; downloads = 다운로드 || 0; downloads++; next(); ));

레이어 경로

경로는 추가 콜백(또는 배열)을 메서드에 전달하여 라우팅 계층을 사용할 수 있습니다. 이는 경로 등을 사용하기 전에 액세스를 제한하거나 데이터를 로드해야 하는 경우에 유용합니다.

일반적으로 비동기 데이터 검색은 아래 표시된 것과 유사할 수 있습니다(여기서는:id 매개변수를 사용하여 사용자 데이터를 로드합니다).

app.get("/user/:id", function(req, res, next) ( loadUser(req.params.id, function(err, user) ( if (err) return next(err); res.send( "사용자 보기" + user.name);

DRY 원칙을 고수하고 코드 가독성을 높이려면 레이어를 사용하여 이러한 로직을 구성할 수 있습니다. 보시다시피 레이어를 사용하여 로직을 추상화하면 레이어를 재사용하고 경로 코드를 더욱 아름답게 만들 수 있습니다.

function loadUser(req, res, next) ( // 여기서는 데이터베이스에서 사용자를 로드합니다. var user = users; if (user) ( req.user = user; next(); ) else ( next(new Error("Failed) 사용자를 로드하려면 " + req.params.id)); ) ) app.get("/user/:id", loadUser, function(req, res) ( res.send("사용자 보기 " + req.user.name ) ;));

여러 라우팅 레이어를 추가할 수 있으며 순차적으로 실행되어 사용자 계정에 대한 액세스를 제한하는 등 다양한 논리를 제공합니다. 아래 예에서는 승인된 사용자만 자신의 계정을 편집할 수 있습니다.

function andRestrictToSelf(req, res, next) ( req.authenticatedUser.id == req.user.id ? next() : next(new Error("Unauthorized")); ) app.get("/user/:id/ edit", loadUser, andRestrictToSelf, function(req, res) ( res.send("사용자 편집 " + req.user.name); ));

레이어가 단지 함수일 뿐이라는 점을 인식하면 아래와 같이 레이어를 반환하는 함수를 작성할 수 있습니다(더욱 표현력이 풍부하고 유연한 솔루션을 제공하기 위해).

function andRestrictTo(role) ( return function(req, res, next) ( req.authenticatedUser.role == role ? next() : next(new Error("Unauthorized")); ) ) app.del("/user/ :id", loadUser, andRestrictTo("admin"), function(req, res) ( res.send("삭제된 사용자 " + req.user.name); ));

자주 사용되는 레이어 "스택"은 임의의 깊이와 트리 구조의 배열로 전달될 수 있습니다(재귀적으로 적용됨).

var a = , b = , 모두 = ; app.get("/foo", a, function() ()); app.get("/bar", a, function() ()); app.get("/", a, middleware3, middleware4, function() ()); app.get("/", a, b, function() ()); app.get("/", all, function() ());

전체 예제는 저장소에서 찾을 수 있습니다.

스택의 나머지 경로 레이어를 건너뛰고 다음 경로를 계속 실행해야 하는 경우가 있습니다. 이렇게 하려면 경로 인수 next("route") 를 사용하여 next()를 호출합니다. 실행할 경로가 남아 있지 않으면 Express는 404 Not Found 오류로 응답합니다.

HTTP 메소드

우리는 이미 app.get()을 여러 번 사용했지만 Express는 app.post(), app.del() 등과 같은 다른 HTTP 메서드도 제공합니다.

POST의 가장 일반적인 사용 사례는 양식을 제출할 때입니다. 아래 예에서는 단순히 HTML 양식을 만들고 있습니다. 그런 다음 제어는 다음 예에서 정의할 경로로 이전됩니다.

기본적으로 Express는 요청 본문으로 무엇을 해야할지 모르기 때문에 application/x-www-form-urlencoded 또는 application/json에 인코딩된 요청 본문을 구문 분석하는 bodyParser() 레이어를 추가해야 합니다. 구문 분석 결과는 req .body 입니다. 이렇게 하려면 아래와 같이 use()라고 말해야 합니다.

app.use(express.bodyParser());

이제 아래 경로는 name 및 email 속성을 갖는 req.body.user 개체에 액세스합니다.

app.post("/", function(req, res) ( console.log(req.body.user); res.redirect("back"); ));

양식이 PUT과 같은 메소드를 사용하는 경우 _method라는 숨겨진 입력을 사용할 수 있으며 이를 통해 HTTP 메소드를 변경할 수 있습니다. 이를 달성하려면 먼저 bodyParser() 뒤에 배치될 methodOverride() 레이어를 활성화해야 하며, 이를 통해 제출된 양식의 필드가 포함된 req.body를 사용할 수 있습니다.

app.use(express.bodyParser()); app.use(express.methodOverride());

Express가 반드시 전체 기능을 즉시 제공할 필요는 없기 때문에 이러한 레이어는 기본적으로 활성화되어 있지 않습니다. 애플리케이션의 필요에 따라 이를 사용하지 않을 수도 있습니다. 그런 다음 PUT 및 DELETE 메서드를 계속 사용할 수 있지만 직접 사용할 수 있습니다. 동시에 methodOverride는 HTML 양식을 위한 탁월한 솔루션입니다. 다음은 PUT 메서드를 사용하는 예입니다.

app.put("/", function() ( console.log(req.body.user); res.redirect("back"); ));

오류 처리 중

Express에는 경로에서 발생하거나 next(err) 로 전달되는 모든 예외를 허용하는 app.error() 메서드가 있습니다. 다음은 직접 만든 NotFound 예외를 사용하여 여러 페이지를 제공하는 방법의 예입니다.

function NotFound(msg) ( this.name = "NotFound"; Error.call(this, msg); Error.captureStackTrace(this, 인수.callee); ) NotFound.prototype.__proto__ = Error.prototype; app.get("/404", function(req, res) ( throw new NotFound; )); app.get("/500", function(req, res) ( throw new Error("keyboard cat!"); ));

아래와 같이 app.error()를 여러 번 호출할 수 있습니다. 여기서는 NotFound 인스턴스를 확인하고 404 페이지를 표시하거나 다음 오류 처리기로 제어를 전달합니다.

이러한 핸들러는 여전히 listening() 의 경로 핸들러 아래에 배치되므로 어디에서나 정의할 수 있습니다. 이를 통해 구성() 블록 내에서 정의할 수 있으므로 현재 환경에 따라 예외를 다르게 처리할 수 있습니다.

app.error(function(err, req, res, next) ( if (err instanceof NotFound) ( res.render("404.jade"); ) else ( next(err); ) ));

단순화를 위해 여기서는 모든 오류의 코드가 500이라고 가정하지만 이를 원하는 대로 변경할 수 있습니다. 예를 들어 노드가 파일 시스템 작업을 수행할 때 "파일 또는 디렉터리를 찾을 수 없음"을 의미하는 error.code = ENOENT 필드가 있는 오류 개체를 얻을 수 있으며, 이를 오류 처리기에서 사용하고 해당 페이지를 표시할 수 있습니다.

app.error(function(err, req, res) ( res.render("500.jade", ( error: err )); ));

응용 프로그램은 Connect의 errorHander 레이어를 사용하여 예외를 처리할 수도 있습니다. 예를 들어 개발 환경에서 stderr에 예외를 표시해야 하는 경우 다음을 수행할 수 있습니다.

app.use(express.errorHandler(( dumpExceptions: true )));

또한 개발 중에 발생하거나 발생하는 예외를 보여주는 멋진 HTML 페이지가 필요할 수도 있습니다. 이 경우 showStack을 true로 설정해야 합니다.

app.use(express.errorHandler(( showStack: true, dumpExceptions: true )));

errorHandler 계층은 Accept: application/json 헤더가 클라이언트에 의해 전달되는 경우에도 JSON으로 응답합니다. 이는 AJAX 애플리케이션 개발에 유용합니다.

전처리 경로 매개변수

사전 처리된 경로 매개변수는 명시적인 데이터 로딩 및 요청 URL 검증을 통해 애플리케이션의 가독성을 크게 향상시킬 수 있습니다. 예를 들어, 특정 쿼리에 대한 일부 데이터를 지속적으로 검색하는 경우(예: /user/:id에 대한 사용자 데이터 로드) 다음과 같이 할 수 있습니다.

app.get("/user/:userId", function(req, res, next) ( User.get(req.params.userId, function(err, user) ( if (err) return next(err); res. send("사용자 " + 사용자.이름 ));

전제 조건을 사용하면 유효성 검사를 수행하고 액세스를 제한하거나 데이터베이스에서 데이터를 로드하는 콜백 함수를 쿼리 매개 변수에 연결할 수 있습니다. 아래 예에서는 콜백을 첨부하려는 매개변수의 이름으로 app.param()을 호출합니다. 보시다시피 필드 이름이 포함된 id 인수를 받습니다. 이런 방식으로 사용자 개체를 로드하고 일반적인 오류 처리와 next()에 대한 간단한 호출을 수행하여 다음 전제 조건이나 경로 처리기로 제어를 전달합니다.

app.param("userId", function(req, res, next, id) ( User.get(id, function(err, user) ( if (err) return next(err); if (!user) return next( new Error("사용자를 찾지 못했습니다.")); req.user = user();

이미 언급한 것처럼 위의 단계를 수행하면 코드의 가독성이 크게 향상되고 애플리케이션의 여러 위치에서 동일한 논리를 쉽게 사용할 수 있습니다.

app.get("/user/:userId", function(req, res) ( res.send("user " + req.user.name); ));

렌더링 뷰

보기 파일 이름은 구성표(이름)를 따릅니다. (engine), 여기서 (engine)은 연결해야 하는 템플릿 엔진 모듈의 이름입니다. 예를 들어,layout.ejs 보기는 보기 시스템에 require("ejs") 를 수행하라고 지시합니다. Express와 통합하려면 로드 가능한 모듈이 메소드 imports.compile(str, options) 를 내보내고 함수를 반환해야 합니다. 이 동작을 변경하려면 app.register() 메서드를 사용할 수 있습니다. 이를 통해 파일 확장자를 특정 엔진과 연결할 수 있습니다. 예를 들어 엔진에서 foo.html을 렌더링하도록 만들 수 있습니다. 에이스.

아래는 사용 예입니다. index.html 을 렌더링합니다. 그리고 우리는layout:false를 사용하지 않기 때문에 index.jade 뷰의 렌더링된 콘텐츠는 로컬 본문 변수로layout.jade 뷰에 전달됩니다.

app.get("/", function(req, res) ( res.render("index.jade", ( 제목: "내 사이트" )); ));

뷰 엔진을 설정하면 기본 템플릿 엔진을 지정할 수 있습니다. 예를 들어 Jade를 사용하면 다음과 같이 할 수 있습니다.

app.set("뷰 엔진", "옥");

그러면 다음과 같이 렌더링할 수 있습니다.

res.render("index");

하지만 이렇지는 않습니다:

res.render("index.jade");

템플릿 엔진이 뷰 엔진을 통해 설치되면 파일 확장자가 필요하지 않습니다. 그러나 동시에 여러 템플릿 엔진을 사용할 수 있습니다.

res.render("another-page.ejs");

Express에는 뷰가 렌더링될 때마다 적용되는 뷰 옵션 설정도 있습니다. 예를 들어 레이아웃을 자주 사용하지 않는다면 다음과 같이 작성할 수 있습니다.

app.set("보기 옵션", ( 레이아웃: false ));

필요한 경우 res.render() 호출에서 오버로드될 수 있습니다.

res.render("myview.ejs", ( 레이아웃: true ));

다른 레이아웃이 필요한 경우 경로를 지정할 수도 있습니다. 예를 들어 뷰 엔진이 jade로 설정되어 있고 레이아웃 파일이 ./views/mylayout.jade 인 경우 간단히 다음을 전달할 수 있습니다.

res.render("page", ( 레이아웃: "mylayout" ));

그렇지 않으면 파일 확장자를 전달할 수 있습니다.

res.render("page", ( 레이아웃: "mylayout.jade" ));

경로는 절대 경로일 수도 있습니다.

res.render("페이지", ( 레이아웃: __dirname + "/../../mylayout.jade" ));

좋은 예는 비표준 열기 및 닫기 엔진 태그를 지정하는 것입니다. 에이스:

app.set("보기 옵션", ( 열기: "((", 닫기: "))" ));

조각 보기

Express 뷰 시스템에는 일종의 미니 뷰인 조각 및 컬렉션에 대한 지원이 내장되어 있습니다. 예를 들어, 주석 목록을 표시하기 위해 뷰를 반복하는 대신 간단히 컬렉션 조각을 사용할 수 있습니다.

부분("주석", (컬렉션: 주석));

다른 옵션이나 지역 변수가 필요하지 않은 경우 개체를 건너뛰고 데이터 배열만 전달할 수 있습니다. 아래 예는 이전 예와 동일합니다.

부분("주석", 주석);

컬렉션을 사용할 때 몇 가지 "마법의" 지역 변수가 있습니다:

  • firstInCollection - 이것이 첫 번째 객체인 경우 true
  • indexInCollection - 컬렉션에 있는 객체의 인덱스
  • lastInCollection - 이것이 마지막 객체인 경우 true
  • collectionLength - 컬렉션 길이

전달되거나 생성된 지역 변수가 우선적으로 적용되지만 상위 뷰에 전달된 지역 변수는 하위 뷰에서도 사용할 수 있습니다. 예를 들어, 부분("blog/post", post)을 사용하여 뷰를 렌더링하고 로컬 변수 post 를 생성하고 이 함수를 호출한 뷰에 로컬 변수 user 가 있는 경우 사용자는 블로그에도 표시됩니다. /포스트 보기.

자세한 문서는 res.partial()을 참조하세요.

참고: 100개 요소의 배열을 렌더링한다는 것은 100개의 뷰를 렌더링한다는 것을 의미하므로 컬렉션을 신중하게 사용하십시오. 간단한 컬렉션의 경우 컬렉션을 사용하는 것보다 뷰를 반복하는 것이 더 좋습니다. 이렇게 하면 부하가 줄어듭니다.

보기 검색

뷰는 상위 뷰를 기준으로 검색됩니다. 예를 들어, views/user/list.jade 뷰가 있고 그 안에서 부분("edit")을 호출하는 경우 시스템은 views/user/edit.jade 뷰를 로드하려고 시도하는 반면, 부분("../ 메시지")는 views/messages.jade를 다운로드하게 됩니다.

뷰 시스템을 사용하면 인덱스 파일을 만들 수도 있습니다. 예를 들어, res.render("users")를 호출하면 views/users.jade 및 views/users/index.jade를 모두 로드할 수 있습니다.

동일한 디렉터리에 있는 보기의 인덱스 파일을 사용할 수도 있습니다. 따라서 부분("users")을 호출하면 부분("index")을 호출하는 대신 ../users/index 뷰에 액세스할 수 있습니다.

템플릿 엔진

다음은 Express와 함께 일반적으로 사용되는 몇 가지 템플릿 엔진입니다.

  • E.J.S.- 내장된 자바스크립트
  • 커피컵- 템플릿 기반 커피스크립트
  • jQuery 템플릿노드용

세션 지원

Connect의 세션 계층을 사용하여 세션 지원을 활성화할 수 있습니다. 또한 이를 위해서는 쿠키를 구문 분석하여 req.cookies에 배치하는 상위 cookieParser 레이어가 필요합니다.

app.use(express.cookieParser()); app.use(express.session(( secret: "keyboard cat" )));

기본적으로 세션 계층은 Connect의 메모리 내 저장소를 사용하지만 다른 솔루션도 많이 있습니다. 예를 들어 연결-redis세션 저장을 지원합니다. 레디스. 사용 방법은 다음과 같습니다.

var RedisStore = require("connect-redis")(express); app.use(express.cookieParser()); app.use(express.session(( secret: "keyboard cat", store: new RedisStore )));

이제 req.session 및 req.sessionStore 속성을 모든 경로 및 후속 레이어에서 사용할 수 있습니다. req.session 속성은 응답 시 자동으로 저장됩니다. 장바구니를 정리하는 방법은 다음과 같습니다.

var RedisStore = require("connect-redis")(express); app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session(( secret: "keyboard cat", store: new RedisStore ))); app.post("/add-to-cart", function(req, res) ( // 양식에서 여러 객체를 전달했다고 가정해 보겠습니다. // 이에 대해 bodyParser()를 사용합니다. var items = req.body.items; req. session.items = items; res.redirect("back" )); app.get("/add-to-cart", function(req, res) ( // GET /add-to-cart로 리디렉션되면 // req.session.items && req.session.items를 확인할 수 있습니다. length // 메시지를 인쇄합니다. if (req.session.items && req.session.items.length) ( req.flash("info", "장바구니에 %s개 항목이 있습니다.", req.session.items.length ); res.render("장바구니");

req.session 객체에는 세션을 조작하기 위한 Session.touch() , Session.destroy() , Session.regenerate() 메서드도 있습니다. 자세한 내용은 Connect Session 설명서를 참조하세요.

마이그레이션 가이드

Express 1.x를 사용하여 작업한 개발자는 마이그레이션 가이드를 참조하여 애플리케이션이 Express 2.x, Connect 1.x 및 Node 0.4.x에서 작동하도록 할 수 있습니다.

요구

req.header(key[, defaultValue])

선택적 기본값인 DefaultValue를 사용하여 키 요청 헤더(대소문자 구분 안 함)를 가져옵니다.

req.header("호스트"); req.header("호스트"); req.header("수락", "*/*");

Referrer 및 Referer 헤더는 특별한 경우입니다. 두 구성 모두 작동합니다.

// "Referrer: http://google.com" 헤더를 보냈습니다. req.header("Referer"); // => "http://google.com" req.header("Referrer"); // => "http://google.com"

req.accepts(유형)

Accept 헤더가 전달되었는지, 지정된 유형과 일치하는지 확인합니다.

Accept 헤더가 누락되면 true가 반환됩니다. 그렇지 않으면 유형이 일치하고 하위 유형이 확인됩니다. MIME 조회 테이블을 사용하여 내부적으로 "text/html"로 변환된 "html"을 전달할 수 있습니다.

// 수락: text/html req.accepts("html"); // => true // 허용: text/*; 애플리케이션/json req.accepts("html"); req.accepts("text/html"); req.accepts("text/plain"); req.accepts("application/json"); // => true req.accepts("image/png"); req.accepts("png"); // => 거짓

req.is(유형)

들어오는 요청에 Content-Type 헤더가 있고 지정된 MIME 유형과 일치하는지 확인합니다.

// 콘텐츠 유형: text/html; charset=utf-8 req.is("html"); req.is("text/html"); // => true // 이제 Content-Type을 application/json으로 둡니다. req.is("json"); req.is("application/json"); // => true req.is("html"); // => 거짓

Express에서는 다양한 요청 확인을 위해 자신만의 콜백을 등록할 수 있습니다. 예를 들어, 들어오는 요청이 이미지인지 확인하기 위해 정밀 검사를 해야 한다고 가정해 보겠습니다. 이렇게 하려면 "이미지" 콜백을 등록하면 됩니다.

app.is("이미지", function(req) ( return 0 == req.headers["content-type"].indexOf("image"); ));

이제 경로 핸들러 내에서 이를 사용하여 "image/jpeg", "image/png" 등의 형식의 Content-Type을 확인할 수 있습니다.

app.post("/image/upload", function(req, res, next) ( if (req.is("이미지")) ( // 특정 작업 수행 ) else ( next(); ) ));

이 방법은 Content-Type에만 적용되는 것이 아니라 모든 종류의 검사를 수행할 수 있다는 점을 잊지 마십시오.

와일드카드 문자를 사용할 수도 있습니다. 그러면 이미지 예제가 단순화됩니다. 여기서는 유형만 확인하겠습니다.

req.is("이미지/*");

아래와 같이 하위 유형을 확인할 수도 있습니다. 여기서 검사는 "application/json" 및 "text/json" 의 경우 true를 반환합니다.

req.is("*/json");

req.param(이름[, 기본값])

매개변수 이름의 값을 반환하거나, 존재하지 않는 경우 기본값을 반환합니다.

경로 매개변수(req.params)를 확인합니다(예: /user/:id).

쿼리 문자열 매개변수(req.query)를 확인합니다(예: ?id=12).

요청 본문(req.body)의 urlencoded 매개변수를 확인합니다(예: id=12).

Urlencoded 요청 본문 매개변수를 받으려면 req.body 객체가 존재해야 합니다. 이렇게 하려면 bodyParser() 레이어를 활성화하세요.

req.get(필드, 매개변수)

헤더 필드 매개변수를 가져옵니다. 기본값은 빈 문자열입니다.

req.get("content-disposition", "파일명"); // => "something.png" req.get("Content-Type", "boundary"); // => "--foo-bar-baz"

req.flash(유형[, 메시지])

팝업 메시지를 대기열에 추가합니다.

req.flash("info", "이메일 전송됨"); req.flash("error", "이메일 전달 실패"); req.flash("info", "이메일 재전송"); // => 2 req.flash("info"); // => ["이메일 전송됨", "이메일 재전송됨"] req.flash("info"); // => req.flash(); // => ( 오류: ["이메일 전달 실패"], 정보: )

팝업 메시지는 형식 문자열을 사용할 수도 있습니다. 기본 문자열 "%s"를 사용할 수 있습니다:

req.flash("info", "_%s_에서 _%s_로 이메일을 전달하지 못했습니다.", toUser, fromUser);

req.isXMLHttpRequest

req.xhr로도 축약됩니다. X-Requested-With 헤더를 확인하여 XMLHttpRequest를 사용하여 요청이 이루어졌는지 확인합니다.

req.xhr req.isXMLHttpRequest

응답

res.header(키[, 값])

응답 헤더를 가져오거나 설정합니다.

res.header("콘텐츠 길이"); // => 정의되지 않음 res.header("Content-Length", 123); // => 123 res.header("콘텐츠 길이"); // => 123

res.charset

다음 Content-Type 헤더의 인코딩을 설정합니다. 예를 들어 res.send() 및 res.render()의 기본값은 "utf8"이며 템플릿을 렌더링하기 전에 명시적으로 인코딩을 설정할 수 있습니다.

res.charset = "ISO-8859-1"; res.render("사용자");

또는 res.send()로 응답하기 전에:

res.charset = "ISO-8859-1"; res.send(str);

또는 Node의 내장 res.end() 사용:

res.charset = "ISO-8859-1"; res.header("콘텐츠 유형", "텍스트/일반"); res.end(str);

res.contentType(유형)

Content-Type 응답 헤더를 설정합니다.

var 파일명 = "경로/to/image.png"; res.contentType(파일명); // 콘텐츠 유형은 이제 "image/png"입니다.

다음 문자열을 사용하여 Content-Type을 설정할 수도 있습니다.

res.contentType("application/json");

또는 파일 확장자만 입력합니다(앞에 점이 표시되지 않음).

res.contentType("json");

res.attachment()

Content-Disposition 응답 헤더를 "attachment" 로 설정합니다. 선택적으로 파일 이름을 전달할 수 있습니다.

res.attachment("path/to/my/image.png");

res.sendfile(경로[, 옵션[, 콜백]])

임의의 파일을 전송하기 위해 res.download()에서 사용됩니다.

res.sendfile("경로/to/my.file");

이 메소드는 파일 전송이 실패하거나 성공할 경우 호출되는 선택적 콜백 매개변수를 허용합니다. 기본적으로 next(err)가 호출되지만 콜백이 전달되는 경우 이를 명시적으로 수행하거나 오류를 처리해야 합니다.

res.sendfile(path, function(err) ( if (err) ( next(err); ) else ( console.log("전송된 %s", 경로); ) ));

fs.createReadStream() 호출에 옵션을 전달할 수도 있습니다. 예를 들어, 버퍼 크기를 변경하려면 다음을 수행하십시오.

res.sendfile(path, ( bufferSize: 1024 ), function(err) ( // 처리 중... ));

res.download(파일[, 파일 이름[, 콜백[, callback2]]])

이 파일을 첨부 파일로 업로드하세요. 선택적으로 대체 파일 이름을 지정할 수 있습니다.

res.download('경로/to/image.png');

res.download('경로/to/image.png', 'foo.png');

이는 다음과 동일합니다.

res.attachment(파일); res.sendfile(파일);

선택적으로 콜백을 res.sendfile() 의 두 번째 또는 세 번째 인수로 지정할 수 있습니다. 그 안에서 헤더가 아직 전송되지 않은 것처럼 응답할 수 있습니다.

res.download(path, "expenses.doc", function(err) ( // 처리 중... ));

선택적으로 두 번째 콜백인 callback2 를 전달할 수도 있습니다. 연결 관련 오류를 처리합니다. 그러나 응답을 보내려고 시도해서는 안 됩니다.

res.download(path, function(err) ( // 오류 또는 종료), function(err) ( // 연결 오류 ));

res.send(body|status[, headers|status[, status]])

res.send() 메소드는 객체(JSON 응답의 경우), 문자열(HTML 응답의 경우), 버퍼 인스턴스 또는 상태 코드(404, 500 등을 지정하는 정수)를 전달할 수 있는 고급 응답 기능입니다. .) . 사용 방법은 다음과 같습니다.

res.send(); // 204 res.send(new Buffer("wahoo")); res.send(( 일부: "json" )); res.send(""); res.send("죄송합니다. 찾을 수 없습니다.", 404); res.send("text", ( "Content-Type": "text/plain" ), 201); res.send(404);

기본적으로 Content-Type 헤더는 자동으로 설정됩니다. 그러나 res.send()에서 명시적으로 수동으로 설정했거나 res.header() 또는 res.contentType()을 사용하기 전에 설정한 경우에는 자동으로 설정되지 않습니다.

이 메서드는 응답을 종료하므로(res.end()와 유사) 여러 응답이나 스트림을 생성해야 하는 경우 res.write() 를 사용해야 합니다.

res.json(obj[, 헤더|상태[, 상태]])

선택적 헤더 및 상태 코드가 포함된 JSON 응답을 보냅니다. 이 방법은 JSON API를 구성하는 데 이상적이지만 res.send(obj)를 사용하여 JSON을 보낼 수도 있습니다(res.send(string)이 HTML을 보내기 때문에 JSON 인코딩 문자열만 보내려는 경우에는 이상적이지 않습니다).

res.json(널); res.json(( 사용자: "tj" )); res.json("가드!", 500); res.json("아무것도 찾을 수 없습니다", 404);

res.redirect(url[, 상태])

지정된 URL로 리디렉션됩니다. 기본 상태 코드는 302입니다.

res.redirect("/", 301); res.redirect("/계정"); res.redirect("http://google.com"); res.redirect("홈"); res.redirect("뒤로");

Express는 리디렉션에 대한 단축키를 지원합니다. 기본 단축키는 "back" 및 "home" 입니다. 이 경우 "back"은 Referrer(또는 Referer) 헤더에 지정된 URL로 리디렉션되고 "home"은 "home" 설정(기본값 "/")을 사용합니다.

res.cookie(이름, 값[, 옵션])

name이라는 쿠키의 값을 val로 설정합니다. 옵션: httpOnly, 보안, 만료 등 경로 옵션의 기본값은 "home" 설정에 설정된 값(보통 "/")입니다.

// 15분 동안 "기억하기" res.cookie("rememberme", "yes", ( 만료: new Date(Date.now() + 900000), httpOnly: true ));

maxAge 속성은 Date.now()를 기준으로 밀리초 단위로 만료되도록 설정할 수 있습니다. 따라서 위의 예는 이제 다음과 같이 다시 작성할 수 있습니다.

res.cookie("rememberme", "yes", ( maxAge: 900000 ));

수신 쿠키를 구문 분석하려면 req.cookies 객체를 생성하는 cookieParser 레이어를 사용하세요.

app.use(express.cookieParser()); app.get("/", function(req, res) ( // req.cookies.rememberme 사용 ));

res.clearCookie(이름[, 옵션])

name이라는 쿠키를 지우고 만료 매개변수에 먼 과거의 날짜를 할당합니다. 옵션은 res.cookie() 와 동일하며, 경로의 기본값은 "home" 설정입니다.

res.clearCookie("기억하세요");

res.render(view[, options[, fn]])

지정된 옵션과 선택적 fn 콜백을 사용하여 뷰를 렌더링합니다. fn이 주어지면 클라이언트에 대한 응답은 자동이 아닙니다. 그렇지 않으면 text/html 응답이 코드 200으로 만들어집니다.

전달된 옵션도 로컬 보기 변수입니다. 예를 들어, 사용자 변수를 전달하고 레이아웃을 비활성화하려면 하나의 개체에서 수행합니다.

var user = ( 이름: "tj" ); res.render("index", ( 레이아웃: false, 사용자: 사용자 ));

옵션 개체는 옵션을 전달하는 데에도 사용됩니다. 예를 들어, 상태 속성을 전달하면 보기에서 사용할 수 있을 뿐만 아니라 응답의 상태 코드도 설정됩니다. 이는 템플릿 엔진이 debug 또는 압축과 같은 특정 옵션을 허용하는 경우에도 유용합니다. 다음은 오류 페이지를 렌더링하는 방법에 대한 예입니다. status는 페이지를 표시하고 상태 코드 res.statusCode를 설정하기 위해 여기에 전달됩니다.

res.render("error", ( 상태: 500, 메시지: "내부 서버 오류" ));

res.partial(보기[, 옵션])

주어진 옵션으로 조각을 렌더링합니다. 이 메서드는 항상 뷰에서 로컬 변수로 액세스할 수 있습니다.

  • object - 뷰에 전달된 객체
  • 객체 객체나 뷰에 전달된 컬렉션의 각 요소를 나타내는 변수의 이름도 마찬가지입니다. 기본값은 보기의 이름입니다.
    • as: "something" - 지역 변수를 추가합니다.
    • as: this - 컬렉션 요소를 뷰 컨텍스트로 사용합니다(this).
    • as: global - 컬렉션 요소와 로컬 뷰 변수의 속성을 함께 병합합니다.
    • 컬렉션 - 객체의 배열입니다. 그 이름은 뷰의 이름에서 유래되었습니다. 예를 들어 video.html에는 내부에 비디오 개체가 있습니다.

다음 구성은 서로 동일하며 조각에 전달된 컬렉션 이름은 항상 "movie" 입니다.

부분("theatre/movie.jade", (컬렉션: 영화 )); 부분("theatre/movie.jade", 영화); 부분("movie.jade", (컬렉션: 영화 )); 부분("movie.jade", 영화); 부분("영화", 영화); // 뷰 내부: moovie.director

지역 변수의 이름을 "movie"에서 "video"로 변경하려면 as 옵션을 사용할 수 있습니다:

부분("영화", (컬렉션: 영화, 형식: "비디오" )); // 뷰 내부: video.director

또한 movie.director 대신 this.director 를 참조할 수 있도록 뷰 내에서 this 값을 영화로 만들 수도 있습니다.

부분("영화", (컬렉션: 영화, as: this )); // 뷰 내부: this.director

대안적인 해결책은 as: global 을 사용하여 컬렉션 요소의 속성을 의사 전역(실제로는 지역) 변수로 확장하는 것입니다.

부분("영화", (컬렉션: 영화, as: 글로벌 )); // 뷰 내부: 디렉터

동일한 논리가 컬렉션뿐만 아니라 프래그먼트 뷰 내부의 개체에도 적용됩니다.

부분("영화", (객체: 영화, as: this )); // 뷰 내부: this.director 부분("movie", ( object: movie, as: global )); // 뷰 내부: Director 부분("movie", ( object: movie, as: "video" )); // 뷰 내부: video.director 부분("movie", ( object: movie )); // 영화 감독

두 번째 인수가 컬렉션이 아닌 경우(.length 없음) 개체로 처리됩니다. 이 경우 이 객체의 지역 변수 이름은 뷰 이름으로 구성됩니다.

var movie = new Movie("크리스마스의 악몽", "Tim Burton") 부분("movie", movie) // => 뷰 내부: movie.director

이 규칙의 예외는 단순 객체("()" 또는 "new Object")가 전달된 다음 로컬 객체로 간주되어 조각 보기 내에서 이름으로 액세스할 수 없는 경우입니다. 예를 들어, 다음 예에서는 지역 변수 "movie" 가 있을 것으로 예상하지만 이는 단순한 객체이므로 지역 변수는 이미 "director" 및 "title" 즉, 해당 속성입니다.

var movie = ( 제목: "크리스마스의 악몽", 감독: "팀 버튼" ); 부분("영화", 영화)

이러한 경우 간단한 개체를 전달해야 하는 경우 이를 일부 속성에 할당하거나 파일 이름에서 개체 이름을 상속하는 개체 속성을 사용하면 됩니다. 아래 나열된 예는 동일합니다.

부분("영화", ( 지역: ( 영화: 영화 )) 부분("영화", ( 영화: 영화 )) 부분("영화", ( 개체: 영화 ))

AJAX 또는 WebSocket을 통해 HTML 조각으로 응답할 수 있도록 경로에서 동일한 API를 사용할 수 있습니다. 예를 들어 경로에서 직접 사용자 컬렉션을 렌더링할 수 있습니다.

app.get("/users", function(req, res) ( if (req.xhr) ( // 컬렉션의 각 사용자에 대한 응답으로 // "user" 뷰에 전달됨 res.partial("user", users) ; ) else ( // 사용자 목록 페이지가 포함된 전체 레이아웃으로 응답합니다. // 부분("user", users)을 만들고 // 일종의 인터페이스를 추가합니다. res.render("users", ( 사용자: 사용자 ) ) ));

res.local(이름[, 값])

지정된 지역 변수를 가져오거나 설정합니다. 이 경우 지역 변수는 res.render() 와 같은 뷰의 렌더링 메서드에 전달된 변수를 참조합니다.

app.all("/movie/:id", function(req, res, next) ( Movie.get(req.params.id, function(err, movie) ( // 할당을 수행합니다 res.locals.movie = movie res .local("영화", 영화 )); app.get("/movie/:id", function(req, res) ( // 지역 변수 movie가 이미 존재하지만 // 필요한 경우 추가할 수 있습니다. res.render("movie", ( displayReviews: true ) ); )));

res.locals(obj)

주어진 obj 객체를 사용하여 여러 지역 변수를 할당합니다. 다음은 동일합니다:

res.local("foo", bar); res.local("bar", baz); res.locals(( foo: bar, bar, baz ));

섬기는 사람

app.set(이름[, 값])

애플리케이션 이름 설정을 val 로 설정하거나, val이 누락된 경우 이름 설정 값을 가져옵니다.

app.set("views", __dirname + "/views"); app.set("보기"); // => ...경로...

앱 설정을 통해 설정으로 이동할 수도 있습니다.

app.settings.views // => ...경로...

app.enable(이름)

이름 설정을 true로 설정합니다.

app.enable("임의의 설정"); app.set("임의의 설정"); // => true app.enabled("임의의 설정"); // => 사실

app.enabled(이름)

이름 설정이 true인지 확인합니다.

app.enabled("캐시 보기"); // => false app.enable("캐시 보기"); app.enabled("캐시 보기"); // => 사실

app.disable(이름)

이름 설정을 false로 설정합니다.

app.disable("일부 설정"); app.set("일부 설정"); // => false app.disabled("일부 설정"); // => 거짓

app.disabled(이름)

이름 설정이 false인지 확인합니다.

app.enable("캐시 보기"); app.disabled("캐시 보기"); // => false app.disable("캐시 보기"); app.disabled("캐시 보기"); // => 사실

app.configure(env|함수[, 함수])

env 환경(또는 모든 환경)에 대한 콜백 함수 콜백을 지정합니다.

app.configure(function() ( // 모든 환경에서 실행됨 )); app.configure("development", function() ( // "개발" 환경에서만 실행됨));

app.redirect(이름, 값)

res.redirect()의 경우 아래와 같이 바로가기(애플리케이션 범위 내)를 정의할 수 있습니다.

app.redirect("google", "http://google.com");

이제 경로에서 다음을 호출할 수 있습니다.

res.redirect("구글");

동적 약어를 사용할 수도 있습니다.

app.redirect("comments", function(req, res) ( return "/post/" + req.params.id + "/comments"; ));

이제 다음을 수행할 수 있으며 리디렉션은 요청 컨텍스트에 따라 동적으로 구축됩니다. GET /post/12를 사용하여 경로를 호출하면 리디렉션은 /post/12/comments가 됩니다.

app.get("/post/:id", function(req, res) ( res.redirect("comments"); ));

마운트된 애플리케이션의 경우, res.redirect()는 애플리케이션의 마운트 지점을 고려합니다. 예를 들어 블로그 애플리케이션이 /blog 에 마운트된 경우 다음 예에서는 /blog/posts로 리디렉션됩니다.

res.redirect("/posts");

app.error(함수)

아래와 같이 첫 번째 매개변수가 모든 예외를 허용하는 오류 처리기 함수를 추가합니다. 이 메서드를 여러 번 호출하여 여러 오류 처리기를 설정할 수 있지만 예외 자체를 처리하지 않으려면 메서드에서 next()를 호출해야 합니다.

app.error(function(err, req, res, next) ( res.send(err.message, 500); ));

app.helpers(obj)

정적 뷰 도우미를 등록합니다.

app.helpers(( name: function(first, last) ( return first + ", " + last ), firstName: "tj", lastName: "holowaychuk" ));

이제 뷰에서는 firstName 및 lastName 변수와 name() 함수를 사용할 수 있습니다.

<%= name(firstName, lastName) %>

Express는 기본적으로 여러 지역 변수도 제공합니다.

  • 설정 - 애플리케이션 설정 객체
  • 레이아웃(경로)은 뷰 내부에서 직접 레이아웃을 지정합니다.

이 메서드의 별칭은 app.locals() 입니다.

app.dynamicHelpers(obj) (#app.dynamic-helpers)

동적 뷰 도우미를 등록합니다. 동적 뷰 도우미는 res , req 를 취하고 뷰를 렌더링하기 전에 서버 인스턴스의 컨텍스트에서 실행되는 단순한 함수입니다. 이러한 함수의 반환 값은 해당 함수와 연결된 지역 변수가 됩니다.

app.dynamicHelpers(( session: function(req, res) ( return req.session; ) ));

이제 모든 뷰가 세션에 액세스할 수 있습니다. 세션 데이터는 session.name 등의 방식으로 사용할 수 있습니다.

<%= session.name %>

앱 조회

지정된 path 와 연관된 경로 핸들러를 반환합니다.

다음과 같은 경로가 있다고 가정해 보겠습니다.

조회 기능을 사용하여 어떤 경로가 지정되어 있는지 확인할 수 있습니다. 이는 Express를 기반으로 구축된 더 높은 수준의 프레임워크에 유용할 수 있습니다.

app.lookup.get("/user/:id"); // => app.lookup.get("/user/:id/:op?"); // => app.lookup.put("/user/:id"); // => app.lookup.all("/user/:id"); // => app.lookup.all("/hey"); // =>

app.lookup.HTTP_METHOD()의 별칭은 콜백 인수 없이 단순히 app.HTTP_METHOD()입니다. 이것이 감소입니다. 예를 들어 다음은 동일합니다.

app.lookup.get("/사용자"); app.get("/사용자");

반환된 각 함수는 유용한 속성으로 보완됩니다.

var fn = app.get("/user/:id/:op?"); fn.regexp // => /^\/user\/(?:([^\/]+?))(?:\/([^\/]+?))?\/?$/i fn .keys // => ["id", "op"] fn.path // => "/user/:id/:op?" fn.method // => "GET"

앱.매치

쿼리 문자열 등을 포함할 수 있는 지정된 URL에서 실행되는 콜백 함수의 배열을 반환합니다. 이는 응답할 수 있는 경로가 무엇인지 이해하는 데 유용할 수 있습니다.

다음과 같은 경로가 있다고 가정해 보겠습니다.

app.get("/user/:id", function() ()); app.put("/user/:id", function() ()); app.get("/user/:id/:op?", function() ());

GET에서 match를 호출하면 마지막 경로의 :op가 선택적 매개변수이기 때문에 두 가지 함수가 반환됩니다.

app.match.get("/user/1"); // =>

그리고 다음 호출은 /user/:id/:op?에 대해 하나의 콜백만 반환합니다. .

app.match.get("/user/23/edit"); // =>

HTTP 메소드가 중요하지 않은 경우 all()을 사용할 수도 있습니다.

app.match.all("/user/20"); // =>

각 기능에는 다음과 같은 속성이 있습니다.

var fn = app.match.get("/user/23/edit"); fn.keys // => ["id", "op"] fn.params // => ( id: "23", op: "edit" ) fn.method // => "GET"

app.mounted(fn)

이 서버가 Server.use() 에 전달될 때 호출되는 fn에 콜백을 할당합니다.

var app = express.createServer(), blog = express.createServer(); blog.mounted(function(parent) ( //부모는 앱 // 블로그는 )); app.use(블로그);

app.register(ext, 내보내기)

템플릿 엔진의 지정된 내보내기 속성(내보내기)을 템플릿 파일의 확장명과 연결합니다.

app.register(".html", require("jade"));

이는 이름이 템플릿 파일 확장자와 정확하게 일치하지 않는 라이브러리의 경우에도 유용할 수 있습니다. 살아있는 예 - Haml.js, 설치된 npm-om을 "hamljs"로 지정하고 기본값인 ".hamljs" 대신 ".haml" 템플릿으로 등록할 수 있습니다.

app.register(".haml", require("haml-js"));

또한, app.register는 API가 Express 사양을 준수하지 않는 템플릿 엔진의 경우 매우 유용합니다. 아래 예에서는 .md 확장자를 렌더러와 연결합니다. 가격 인하-파일. 더 나은 성능을 위해 처음에만 HTML로 렌더링할 것이며 "(이름)" 형식의 변수 대체를 지원할 것입니다.

app.register(".md", ( 컴파일: function(str, 옵션) ( var html = md.toHTML(str); return function(locals) ( return html.replace(/\(([^)]+) \)/g, function(_, name) ( return locals; ) ));

app.listen()

앱 서버 소켓을 호스트:포트 주소에 바인딩합니다. 기본 포트는 3000이고 호스트는 INADDR_ANY입니다.

app.listen(); app.listen(3000); app.listen(3000, "n.n.n.n");

포트 인수는 경로를 나타내는 문자열일 수도 있습니다. 유닉스 도메인 소켓:

app.listen("/tmp/express.sock");

이제 시도해 보겠습니다.

$ telnet /tmp/express.sock GET / HTTP/1.1 HTTP/1.1 200 OK 콘텐츠 유형: text/plain 콘텐츠 길이: 11 Hello World

프로젝트 참여자

이 프로젝트의 주요 기여자는 다음과 같습니다.

  • TJ Holowaychuk (비전미디어)
  • Ciaran Jessup (시아란지)
  • 아론 헤크만(Aheckmann)
  • 기예르모 라우흐(guille)

타사 모듈

다음 모듈은 Express와 함께 작동하거나 Express를 기반으로 구축됩니다.

  • 리소스 라우팅 제공
  • 팝업 알림을 렌더링하는 빠른 메시지
  • 비동기 구성에 대한 express-configure 지원(Redis에서 데이터 로드 등)
  • express-namespace - 경로의 네임스페이스
  • express-expose는 단순히 애플리케이션의 클라이언트 측에 JS 코드를 게시합니다.
  • express-params - app.param() 확장
  • express-mongoose - Mongoose 쿼리 결과를 쉽게 렌더링하기 위한 플러그인(MongoDB용 ORM)

구문 패턴을 살펴보면 애플리케이션에 새 경로를 추가하려면 다음과 같이 하면 됩니다.

Router.get("/app", function(req, res) ( res.render("app", ( title: "Express" )); ));

이 경로인가요? 이게 컨트롤러인가요?

가장 흥미로운 점은 경로가 논리를 포함하는 함수라는 것입니다. 경로 내부에는 res.render 함수가 있습니다.

Res.render("foo", ( 제목: "익스프레스" ));

뷰 템플릿에는 다음이 표시됩니다.

H1= 제목 p #(제목)에 오신 것을 환영합니다.

이는 컨트롤러/경로에서 데이터를 가져와 뷰에 표시하는 방법에 대한 두 가지 예입니다. 이 예에서는 HTML을 출력합니다.

표현하다

익스프레스에 오신 것을 환영합니다

이 모든 것은 문제에서 비롯된 것 같습니다. 경로에 컨트롤러 정보도 포함될 수 있습니까? 이는 사실이며, 이것이 커뮤니티에서 폴더 이름을 경로에서 컨트롤러로 변경하려는 움직임이 있는 이유입니다.

이에 대한 좋은 예는 Express MVC 예에서 볼 수 있습니다.

그러나 일관성을 위해 이 가이드에서는 현재 규칙을 따르겠습니다.

404 오류

오류가 이미 Express로 전송되고 있습니다. app.js 파일에는 다음이 포함됩니다.

/// 404를 포착하고 오류 처리기로 리디렉션 app.use(function(req, res, next) ( var err = new Error("Not Found"); err.status = 404; next(err); ));

views/ 폴더에errors.jade가 있습니다.

레이아웃 블록 콘텐츠 확장 h1= 메시지 h2= error.status pre #(error.stack)

간단 해. 404 페이지를 사용자 정의하려면 이 보기를 편집하면 됩니다.

노드 JS 및 Express 기본 사항(III).

npm이 무엇이고 무엇이 필요한지 이해해 봅시다. Express 및 EJS 템플릿 엔진을 설치합니다. 우리는 모든 준비 작업을 수행하고 NodeJS에서 자체 웹사이트를 만들기 시작합니다.

이제 지속적으로 변경되는 매개변수가 제공됩니다.

/mews/value 뒤에 특정 값에 대한 참조를 생성해야 하는 경우. 그것은 바뀔 것이다. 예: 23, 부분 또는 기타 값.

App.get("/news/:id", function(req, res)( res.send("ID는 - " + req.params.id); ));

이 매개변수에 따라 데이터베이스(데이터베이스)에서 데이터를 가져와 특정 기사를 표시할 수 있습니다.

ID 데이터를 전송하고 이 데이터에 따라 특정 정보를 표시할 특정 HTML 파일이 필요합니다.

우리에겐 좀 필요해 템플릿 엔진.

Express 덕분에 여러 템플릿 엔진을 사용할 수 있습니다.

EJS는 선택 패키지이므로 설치해야 합니다.

엔터 키를 치시오

그 후에는 프로젝트에 설치됩니다.

이를 통해 다양한 템플릿에 데이터를 전달할 수 있으며 이러한 템플릿의 확장자는 .ejs입니다.

이 템플릿에서는 HTML 코드와 삽입된 js 코드(변수, 출력 루프 등)를 표시할 수 있습니다.

전송된 데이터에 따라 변경되는 페이지 템플릿이 있습니다.

가장 먼저 해야 할 일은 사용할 뷰 엔진을 지정하는 것입니다.

뷰 엔진은 기본적으로 템플릿 엔진입니다.

그 수가 많고 우리는 EJS를 선택했기 때문에 index.js 파일에 이를 표시해야 합니다.

앱 변수를 초기화한 직후입니다.

App.set("view-engine", "ejs");

표시할 모든 파일은 기본적으로 views 폴더에서 검색됩니다.

index.js와 동일한 수준에서 views 폴더를 생성합니다.

그 안에 새로운 파일 news.ejs를 생성할 것입니다. 이것은 우리가 작성할 일종의 템플릿이 될 것입니다.

가장 일반적인 HTML 코드를 이러한 템플릿에 넣을 수 있습니다.

소식

뉴스 페이지.

이렇게 하려면 .send 또는 .sendFile 메서드를 사용할 필요가 없지만 render() 메서드가 필요합니다.

render() 메서드는 views 폴더에서 원하는 파일(템플릿)을 가져와 브라우저에 표시할 수 있습니다. 게다가 이 템플릿에 특정 매개변수를 전달할 수도 있습니다.

render() 메서드에 확장을 지정할 수 없습니다. 다음으로 일부 매개변수를 템플릿 자체에 전달할 수 있습니다. 따라서 객체를 두 번째 매개변수로 전달합니다. 여기에는 많은 수의 속성과 값이 포함될 수 있습니다.

req.params.id 값과 함께 특정 매개변수 newsId를 전달하기로 결정했다고 가정해 보겠습니다. 즉, 값은 호출된 ID 자체가 됩니다.

App.get("/news/:id", function(req, res)( render("news", (newsId: req.params.id)); ));

따라서 값은 id 값과 함께 newsId 라고 불리는 뉴스 템플릿에 전달됩니다.

news.ejs 파일에서 이 모든 것을 받아들이고 표시할 수 있습니다.

news.ejs 파일을 조금 변경해 보겠습니다. 페이지 제목에 ID를 표시하겠습니다.

모든 내용은 EJS 템플릿 엔진 문서(위 링크)에서 찾을 수 있습니다.

ID가 있는 뉴스 페이지 =<%= newsId %>

파일 /views/news.ejs

소식

ID가 있는 뉴스 페이지 =<%= newsId %>

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque numquam libero, veniam ipsum odit Molestiae esse quia blanditiis magni debitis aliquam, pariatur nam quaerat quas nemo, facilis temporibus labiosam, consectetur adipisicing elit. Maiores enim vitae dolore nemo quas aliquam quia 부패한 rerum ipsam ad nesciunt, 건축가, pariatur officiis. Maxime iste ullam quibusdam, nobis voluptas!

index.js 파일

표현하자 = require("표현하다"); let app = express(); app.set("뷰 엔진", "ejs"); app.get("/", function(req, res)( res.sendFile(__dirname + "/index.html"); )); app.get("/about", function(req, res)( res.sendFile(__dirname + "/about.html"); )); app.get("/news/:id", function(req, res)( res.render("news", (newsId: req.params.id)); )); app.listen(8080);

여러 매개변수를 전달할 수 있습니다. 예를 들어:

App.get("/news/:id", function(req, res)( res.render("news", (newsId: req.params.id, newParam: 535 )); ));

그리고 news.ejs 파일에서 다음과 같이 페이지에 표시합니다.

<%= newParam %>

게다가, 우리 자신의 객체를 전송할 수도 있습니다. 예를 들어 객체를 생성해 보겠습니다.

App.get("/news/:id", function(req, res)( let obj = (제목:"뉴스", id: 4); res.render("news", (newsId: req.params.id, newParam: 535)); )));

그리고 이 객체를 전송할 수도 있습니다. 먼저 전송할 내용의 이름을 결정한 다음 전송 내용을 표시합니다.

예를 들어:

App.get("/news/:id", function(req, res)( let obj = ( title:"News", id: 4); res.render("news", (newsId: req.params.id , newParam: 535, obj: obj ));

제목 =<%= obj.title %>

아이디=<%= obj.id %>

<%= newParam %>

템플릿에 배열을 전달합니다.

데이터 배열을 만들고 루프를 사용하여 표시해 보겠습니다.

App.get("/news/:id", function(req, res)( let obj = ( title:"News", id: 4, 단락:["단락", "일반 텍스트", "번호: 3, 7, 24", 476]); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); )));

이제 템플릿 자체에서 이 배열을 루프로 출력하겠습니다.

    <% obj.paragraphs.forEach(function(item) { %>
  • <%= item %>
  • <% }); %>

정적 파일 및 미들웨어.

다른 파일에 포함될 수 있는 파일입니다.

이제 news.ejs라는 하나의 템플릿이 생겼습니다. 상상해보세요. 그들 중 많은 수가 있다는 것입니다. 수십. 그리고 이 모든 파일에 나타나는 코드의 일부를 변경해야 합니다. 많은 변화가 이루어져야 할 것입니다.

이를 방지하려면 다른 파일에 포함될 수 있는 파일을 사용하면 됩니다. 예를 들어. 사이트 헤더가 포함된 파일이 있습니다. 그리고 무언가를 변경해야 하는 경우 파일은 단순히 다른 파일에 연결되므로 하나의 파일만 변경하는 것으로 충분합니다.

보기 템플릿 폴더에서 블록이라는 폴더를 만들고 그 안에 hrader.ejs 파일을 만듭니다.

파일 hrader.ejs

  • 메인으로
  • 회사 소개
  • 소식

이제 모든 템플릿에 이 파일을 포함해야 합니다. 뉴스 파일로 이동하여 여는 body 태그 바로 뒤에 다음을 작성하십시오.

<% include blocks/header.ejs %>

템플릿 엔진은 항상 그곳에서 검색을 시작하므로 경로는 views 폴더에서 지정됩니다.

정적 파일.

index.js 수준에서 public이라는 새 폴더를 만들어 보겠습니다. 여기에는 모든 정적 파일이 포함됩니다. CSS 파일, 사진, 문서 등이 있습니다. 모든 파일입니다. 우리 사이트의 다양한 페이지에서 호출됩니다.

이 폴더에 또 다른 폴더인 css를 만들고 그 안에 style.css 파일을 만듭니다.

index.ejs 파일의 모든 스타일 코드를 해당 파일로 전송합니다.

.ejs 파일에는 다음 스타일이 포함됩니다.

지금 확인해 보면 아무 일도 일어나지 않을 것입니다. 스타일이 연결되지 않습니다.

정적 파일을 포함하려면 미들웨어를 사용해야 합니다.

상단의 index.js 파일에서 app.set 바로 뒤에 다음과 같이 작성해야 합니다.

App.use("/공개",);

이제 /public으로 시작하는 링크를 사용하면 NodeJS와 Express 자체가 우리가 사용하는 내용을 이해할 것입니다. 정적 파일그러면 모든 것이 올바르게 연결될 것입니다.

두 번째는 express.static("public"), 즉 /public 폴더에서 찾는 곳입니다.

요약하면 코드에서 app.use("/public", express.static("public")); 우리는 우리가 작성한 링크를 추적합니다

다음과 같다면:

그러면 이 코드에서는 다음과 같습니다.

App.use("/assets", express.static("공개"));

이 경우 public은 폴더를 가리킵니다!

그대로 놔두면 아무 변화도 일어나지 않습니다. 자산 링크를 추적할 예정이므로 파일이 포함됩니다.

App.use("/assets ", express.static("public "));

혼동을 피하기 위해 일반적으로 동일한 이름의 링크와 폴더를 만듭니다. 대부분의 경우 공개됩니다.

미들웨어는 페이지(서버)에 데이터를 보내기 전에 수행하는 작업입니다.

이 경우 이것이 미들웨어입니다.

HTML 양식 생성 및 데이터 검색

가장 먼저 할 일은 사이트에 양식 자체를 추가하는 것입니다.

about.ejs 파일을 열고 여기에 부트스트랩 기술을 사용하여 양식을 추가하겠습니다.

검색창에 Forms를 입력하고 찾은 페이지 상단에서 첫 번째 Form을 복사하세요.

저장하고 실행해보자.

POST 요청.

POST 요청을 수행할 것이므로 양식에 여러 속성을 추가해야 합니다.

Method="post" - POST 요청 때문에

그리고 action=""은 사용자가 "제출"을 클릭한 후 사용자를 리디렉션해야 하는 곳입니다. 우리의 경우는 다음과 같습니다.

index.js 파일에서 다른 모든 작업을 수행해야 합니다.

먼저 body-parser라는 패키지를 다운로드해야 합니다.

이를 통해 양식에서 오는 POST 요청을 받아 처리할 수 있습니다. 즉, 양식에서 모든 데이터를 가져옵니다.

설치하려면 CS의 프로젝트 폴더에 작성하세요.

npm 설치 본문 파서

엔터 키를 치시오.

패키지가 설치되었습니다.

설치 후에는 간단한 지침을 따라야 합니다.

웹사이트의 예제 섹션으로 이동하여 거기에서 급행 노선별 섹션을 찾아보겠습니다.

  1. 필요한 모듈을 연결합니다.
  2. Var bodyParser = require("body-parser")

    Var urlencodedParser = bodyParser.urlencoded(( 확장: false ))

    즉, POST 요청에서 데이터를 가져와 필요에 따라 작업할 수 있게 해주는 파서입니다.

  3. 또한 문서에 따르면 POST 요청을 추적하고 일부 미들웨어(urlencodedParser)를 전달해야 한다는 것을 알 수 있습니다. 우리는 이전에 이미 GET 요청을 추적한 적이 있습니다.

폼에서 받은 데이터를 콘솔에 출력하겠습니다.

Console.log(req.body);

즉시 수표를 추가할 수 있습니다. 양식 데이터가 제출되지 않으면 단순히 오류가 발생합니다.

(!req.body)가 res.sendStatus(400)을 반환하는 경우

양식 자체에서 필드에 대한 이름 속성을 지정해야 합니다. 이는 속성의 이름이 되며 값은 사용자가 입력하는 값이 됩니다.

회사 소개. <% include blocks/header.ejs %>

두 번째 수준 제목.

메인으로

세 번째 수준 제목.

이러한 문제의 중요성은 매우 명백하여 광범위한 활동가와의 협의를 통해 우리는 대중 참여 시스템을 개발하는 데 중요한 작업을 수행할 수 있습니다. 더 높은 수준의 이념적 고려와 인력 훈련의 범위와 장소를 통해 우리는 긴급한 요구를 충족하는 인력 훈련 시스템의 중요성을 평가할 수 있습니다. 그러나 다양한 자산과의 협의가 긴급한 요구에 부응하는 인력 양성 시스템을 준비하고 실행하는 데 기여한다는 점을 잊어서는 안 됩니다.

그러나 광범위한 자산과의 협의가 긴급한 요구에 맞는 인력 교육 시스템을 준비하고 구현하는 데 기여한다는 점을 잊어서는 안됩니다.

우리는 귀하의 이메일을 다른 누구와도 공유하지 않습니다.

표현하자 = require("표현하다"); var bodyParser = require("body-parser"); let app = express(); var urlencodedParser = bodyParser.urlencoded(( 확장: false )); app.set("뷰 엔진", "ejs"); app.use("/public", express.static("public")); app.get("/", function(req, res)( res.render("index"); )); app.get("/about", function(req, res)( res.render("about"); )); app.post("/about", urlencodedParser, function(req, res)( if (!req.body) return res.sendStatus(400); console.log(req.body); res.render("about") ;)); app.get("/news", function(req, res) ( res.render("news-common",(newParam1:"Param-1")); )); app.get("/news/:id", function(req, res)( let obj = ( 제목:"뉴스", id: 4, 단락:["Paragraph", "일반 텍스트", "번호: 3, 7, 24", 476]); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); )); app.listen(8080);

데이터를 입력하고 보내기를 클릭하세요. 콘솔에서 이 데이터(속성 - 값)의 출력을 볼 수 있습니다.

양식을 제출하면 페이지가 다시 로드되고 콘솔에 전송된 데이터가 표시됩니다.

이제 전송 후 다른 데이터를 표시하도록 만들 수 있습니다.

index.js 파일의 약간의 코드를 변경해 보겠습니다.

App.post("/about", urlencodedParser, function(req, res)( if (!req.body) return res.sendStatus(400); console.log(req.body); res.render(" 성공 정보", (데이터: req.body)); });

이런 식으로 about-success.ejs 페이지를 출력하고 이제 views 폴더에 생성하겠습니다. 두 번째 매개변수로 양식 데이터를 객체로 전달합니다. - (데이터: req.body)

회사 소개. <% include blocks/header.ejs %>

안녕하세요, Node.js의 첫 페이지입니다.

두 번째 수준 제목.

메인으로

마찬가지로 구조의 강화 및 개발은 긴급한 요구를 충족하는 인력 교육 시스템의 준비 및 구현에 기여합니다. 마찬가지로, 직위를 형성하는 일상 업무를 시작하려면 중요한 재정 및 행정 상황을 분석해야 합니다.

감사합니다

이메일: <%= data.email %>
통과하다: <%= data.pass %>
isCheck: <%= data.check %>

이렇게 하면 양식에서 제공되는 데이터를 추적하고 규정 준수 여부를 확인할 수 있으며 사용자가 항목을 작성하지 않은 경우 오류가 발생하는 등의 작업을 수행할 수 있습니다.

또한, 이 데이터를 이메일로 보내거나 데이터베이스에 저장하는 것이 편리할 것입니다.

우편으로 보내고 싶다면. npm에는 Nodemailer라는 또 다른 패키지가 있습니다. 이 패키지를 사용하면 데이터를 이메일로 직접 보낼 수 있습니다. 사용하기 쉽습니다. 그리고 그것의 도움으로 사용자가 작성한 양식의 모든 데이터를 우편으로 받을 수 있습니다.

NodeJS는 많은 추가 패키지를 제공합니다. 예를 들어, 우리는 링크를 추적하고 템플릿 엔진을 사용하는 것을 더 쉽게 만들기 위해 Express를 사용했습니다. 양식에서 받은 데이터를 받아들이기 위한 Body-parseer. Nodemailer - 이메일로 데이터를 전송합니다.

URL 문자열에서 데이터를 가져오는 방법.

주소 표시줄에서 다음과 같은 유형의 데이터를 가져와야 하는 경우가 있습니다.

http://localhost:8080/news/12?filter-id&city=london

예를 들어 index.js 파일의 이 코드를 사용하여 이 데이터를 가져오는 방법을 살펴보겠습니다.

App.get("/news/:id", function(req, res)( let obj = ( title:"News", id: 4, paragraphs:["Paragraph", "Plain text", "Numbers: 3, 7, 24", 476]); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); ));

간단히 이 데이터를 콘솔에 출력해 보겠습니다.

App.get("/news/:id", function(req, res)( let obj = ( title:"News", id: 4, paragraphs:["Paragraph", "Plain text", "Numbers: 3, 7, 24", 476]); console.log(req.query); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); ));

콘솔에서 우리는 볼 수 있습니다

( 필터: "id", 도시: "런던")

이는 때때로 유용할 수 있습니다.

이 글은 초보 개발자와 Node js Express 작업에 관심이 있는 모든 사람을 대상으로 작성되었습니다. 이를 마스터하려면 JavaScript의 기본 사항을 알아야 합니다.

Node.js란 무엇입니까?

Node.js는 Chrome의 V8 JavaScript 엔진을 기반으로 하는 비동기 JavaScript 런타임입니다. 확장 가능한 네트워크 애플리케이션을 생성하도록 설계되었습니다.

Node.js를 사용하면 서버측 JavaScript 코드를 작성할 수 있습니다. 이제 어떻게 하는 것인지 궁금할 것입니다. JavaScript는 브라우저에서 실행되는 언어입니다. 브라우저는 JavaScript 코드를 받아들이고 이를 명령으로 컴파일합니다. Node.js의 창시자는 Chrome 엔진을 가져와 런타임( 실행 시간) 서버에서 작동하도록 합니다. 언어를 해석할 수 있는 매체이다. 이제 우리는 무엇을 가지고 있습니까? 백엔드에서 JavaScript를 작성하는 방법입니다.

정의에 관해서라면, 이 맥락에서 "비동기"라는 용어가 무엇을 의미하는지 궁금할 것입니다. JavaScript는 단일 스레드 언어입니다. 따라서 이벤트로 인해 기본 실행 스레드가 중단되는 것을 원하지 않습니다. 이는 메인 스레드를 중단하지 않고 이벤트를 처리하는 것을 의미합니다.

Node.js는 이러한 비차단 설계를 기반으로 하며 웹 애플리케이션 구축을 위한 가장 빠른 도구 중 하나입니다. 다음 "Hello World" 예제에서는 많은 연결을 동시에 처리할 수 있습니다. 각 연결은 콜백을 트리거합니다.

이 Node js Express 예제에는 6개의 간단한 단계가 있습니다.

  1. 해당 플랫폼(MacOS, Windows 또는 Linux)에 맞게 Node.js를 설치하세요.

Node.js

Node.js®는 Chrome용 V8 JavaScript 엔진에 내장된 JavaScript 런타임입니다. Node.js는 이벤트 중심의 비차단 I/O를 사용합니다...

첫 번째 단계는 로컬 컴퓨터에 JavaScript 인스턴스를 가져오는 것입니다. 브라우저의 주소 표시줄에 nodejs.org를 입력하거나 링크를 클릭하면 완료됩니다. 시작 창에서는 원하는 것을 즉시 제공해야 합니다. 내 컴퓨터에서 Ubuntu를 실행하면 내 운영 체제에 해당하는 Node.js 버전이 표시됩니다. 다운로드하여 설치하세요. 그러면 로컬 컴퓨터에서 서버를 실행하는 데 필요한 도구가 제공됩니다.

  1. 명령 프롬프트를 열고 다음을 입력하세요.

mkdir myapp cd myapp

이러한 Node js Express Post 명령은 모든 운영 체제에서 보편적입니다. 첫 번째는 현재 있는 디렉토리 내에 새 디렉토리를 생성합니다( mkdir = "make Directory" ). 후자는 새로 생성된 디렉토리인 cd = "change Directory"로 변경됩니다.

  1. 프로젝트를 실행하고 npm에 연결하세요.

myapp이라는 디렉터리를 생성한 후 프로젝트를 실행하고 npm과 연결해야 합니다.

Npm은 노드 패키지 관리자( 노드 패키지 관리자). 여기에는 모든 Node 패키지가 있는 곳입니다. 특정 기능을 수행하는 모듈, 코드 패키지로 생각할 수 있습니다. 우리는 이러한 모듈에서 제공하는 응용 프로그램 인터페이스인 API를 사용합니다.

모듈은 원하는 결과를 얻기 위해 밀고 당길 수 있는 버튼과 레버가 있는 블랙박스 역할을 합니다. 아래 명령을 실행하면 프로젝트가 시작됩니다.

myapp 폴더에 package.json 파일을 생성합니다. 파일에는 프로젝트에 로드되는 모든 npm 패키지에 대한 링크가 포함되어 있습니다.

이 명령은 작업에 대한 몇 가지 옵션을 입력하라는 메시지를 표시합니다. 다음을 제외한 모든 경로를 통해 경로를 입력할 수 있습니다.

진입점: (index.js)

이것을 다음과 같이 변경하고 싶을 것입니다:

  1. myapp 디렉토리에 Express 설치

Express는 웹에 강력한 기능 세트를 제공하는 최소한의 유연한 Node.js 웹 애플리케이션 프레임워크입니다.

myapp 디렉터리에서 다음을 실행합니다.

npm 설치 익스프레스 --저장

설치 명령은 설치할 Node js Express 파일 패키지를 계속 검색합니다. 프로젝트에 설치하세요.

이제 프로젝트 루트에 node_modules 폴더가 생성됩니다. -save를 추가하면 myapp 디렉터리의 package.json에 있는 종속성 목록에 패키지를 저장할 수 있습니다.

Express는 웹 애플리케이션을 생성하고 실행하기 위한 도구 세트를 제공합니다. Express는 매우 인기가 높아져 이제 대다수의 Node.js 애플리케이션에서 표준이 되었습니다. Express를 사용하는 것이 좋습니다.

  1. 텍스트 편집기를 실행하고 app.js라는 파일을 만듭니다.

Express Node를 설치한 후 생성된 파일에 다음 코드를 추가합니다.

var express = require("express"); var 앱 = 표현(); app.get("/", function (req, res) ( res.send("Hello World!"); )); app.listen(3000, function () ( console.log("포트 3000에서 수신 대기하는 앱 예시!"); ));

여기서는 최근에 설치된 패키지를 사용해야 합니다. 첫 번째 줄은 node_modules 폴더에 있는 express 모듈을 포함할 변수를 선언합니다.

모듈은 함수입니다. 함수 호출을 다른 변수에 할당하면 향후 작업을 더 쉽게 만들어주는 사전 정의된 도구 세트에 액세스할 수 있습니다. 임시 애플리케이션은 실제 프로그램을 생성하는 데 사용하는 메서드가 있는 개체로 생각할 수 있습니다.

Listen 메소드는 서버를 시작하고 포트 3000에서 연결을 수신합니다. 그는 “Hello World! " 루트 URL(/)에 대한 GET 요청의 경우. 다른 경로의 경우 404 Not Found 로 응답합니다.

  1. 애플리케이션 실행

다음 명령을 입력하십시오.

명령을 실행한 후 브라우저에 http://localhost:3000/을 입력하여 결과를 확인하세요. "도 보아야 합니다. 포트 3000에서 수신 대기하는 앱 예시».