티스토리 뷰
요청 객체 (Request)
요청 객체는 일반적으로 콜백에 전달되므로 이름은 원하는 대로 정해도 된다. 보통 req나 request를 사용한다.
요청 객체는 핵심 노드 객체인 http.IncomingMessage 인스턴스에서 시작하며,
익스프레스를 사용하는 경우 익스프레스에서 기능을 추가한다.
req.params
이름 붙은 라우트 매개변수를 담고 있는 배열
GET Request의 URL에서 콜론(:) 뒤에 오는 파라미터를 가져올 때(파싱) 사용한다. 실제 URL에 콜론(:)이 입력되지는 않는다.
app.get(’/:idx’, (req, res) => {
res.send(req.params.idx);
});
// http://www.sample.com/comments/777
app.get('/comments/:id', function(req, res){
console.log(req.params.id); // 777
});
req.params(name)
이름 붙은 라우트 매개변수나 GET, POST 매개변수를 반환한다.
req.query
쿼리스트링 매개변수(GET 매개변수)를 이름/값 쌍 형태로 담고 있는 객체
GET Request의 URL에서 물음표(?) 뒤에 오는 쿼리 값들을 가져올(파싱) 때 사용한다.
쿼리의 경우 파라미터와 달리 실제 URL에 물음표(?)가 들어간다.
// http://www.sample.com/index?name=jason&number=777
app.get('/index', function(req, res){
console.log(req.query.name); // jason
console.log(req.query.number); // 777
});
req.body
POST Request의 body에 붙은 값들을 가져올(파싱) 때 사용한다.
body-parser 패키지를 설치하고 이를 미들웨어로 사용해야 body 안의 내용을 가져올 수 있다.
Post Request를 전송하는 html form 안에서 input 태그의 name을 key로 하는 데이터에 접근하는 형태가 일반적이다.
<form action="/index" method="POST">
<input type="text" name="username">
<input type="password" name="password">
</form>
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/index', function(req, res){
console.log(req.body.username);
console.log(req.body.password);
});
위의 html form이 ejs 파일일 경우 아래처럼 대괄호를 통해 object로 묶어서 처리할 수도 있다.
이 때, urlencoded의 extended는 반드시 true여야 한다.
<form action="/index" method="POST">
<input type="text" name="info[username]">
<input type="password" name="info[password]">
</form>
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/index', function(req, res){
console.log(req.body.info);
});
req.route
현재 일치한 라우트에 관한 정보
주로 라우트 디버그에 사용한다.
req.cookies(req.signedCookies)
클라이언트에서 전달한 쿠키 값을 담고 있는 객체
req.headers
클라이언트에서 받은 요청 헤더(HTTP의 Header)
req.accepts([types])
클라이언트가 해당하는 타입을 받을 수 있는지 확인하는 간단한 메서드.
옵션인 types 에는 application/json 같은 마임 타입이나, 쉼표로 구분한 목록, 배열을 쓸 수 있다.
이 메서드는 공용 API를 만드는 사람에게 유용하며, 브라우저가 항상 기본값으로 HTML을 받는다고 가정한다.
req.ip
클라이언트의 IP Address
req.path
클라이언트가 요청한 경로. 프로토콜, 호스트, 포트, 쿼리 스트링을 제외한 순수 요청 경로
req.host
클라이언트에서 보고한 호스트 이름을 반환하는 간편 메서드
이 정보는 조작될 수 있으므로 보안 목적에 사용해서는 안 된다.
req.xhr
요청이 AJAX 호출에서 시작 됐다면 true를 반환하는 프로퍼티
req.protocol
현재 요청을 만드는 데 사용된 프로토콜(http, https 등)
req.secure
보안 연결 이면 true를 반환하는 프로퍼티
req.protocol === 'https' 와 같다.
req.url (req.originalUrl)
URL 경로와 쿼리 스트링을 반환. 원본 요청을 logging 하는 목적으로 쓴다.
req.url은 내부 라우팅 목적으로 고쳐 쓸 수 있지만
req.originalUrl은 원래 요청과 쿼리스트링을 보관할 목적으로 만들어졌다.
req.acceptedLanguages
클라이언트가 선호하는 자연어 목록을 반환
header에서 파싱 하면 다국어를 지원하는 애플리케이션이라면 초기 언어 선택에 도움을 줄 수 있다.
응답 객체(Response)
응답 객체는 일반적으로 콜백에 전달되므로 이름은 원하는 대로 정해도 된다. 보통 res나 resp, response를 사용한다.
응답 객체는 핵심 노드 객체인 http.ServerResponse 인스턴스에서 시작하며,
익스프레스를 사용하는 경우 익스프레스에서 기능을 추가한다.
res.status(code)
HTTP 상태 코드를 설정한다.
익스프레스의 기본값은 200(성공)이므로
404(찾을 수 없음)나 500(내부 서버 오류), 기타 상태 코드를 반환하려면 이 메서드를 써야 한다.
리다이렉트(상태 코드 301,302,303,307)에는 redirect 메서드가 유용하다.
res.set(name, value)
응답 헤더를 설정한다.
res.cookie(name, value, [options])
클라이언트에 저장될 쿠키를 설정하거나 제거한다. cookie-parser 패키지가 필요하다.
res.redirect([status], url)
브라우저를 리다이렉트 한다. 기본 리다이렉션 코드는 302(찾았음)이다.
페이지를 영구히 이동했다면 코드 301(영구 이동)을 써야 하고, 그 외에는 일반적으로 리다이렉션을 최소화하는 것이 좋다.
res.send(body), res.send(status, body)
클라이언트에 응답을 보내며, 상태 코드는 옵션이다.
익스프레스 기본 콘텐츠 타입은 text/html이므로, 예를 들어 text/plain으로 바꾸려면 res.send를 호출하기 전에 먼저 res.set('Content-Type', 'text/plain')을 호출해야 한다.
body가 객체 또는 배열이라면 응답으로 JSON이 사용되므로(콘텐츠 타입은 자동으로 바뀜)
JSON을 보낼 거라면 명시적으로 res.json을 써야 한다.
res.json(json), res.json(status, json)
클라이언트에 JSON을 보내며, 상태 코드는 옵션이다.
res.jsonp(json), res.jsonp(status, json)
클라이언트에 JOSNP를 보내며, 상태 코드는 옵션이다.
res.type(type)
Content-Type 헤더를 설정하는 메서드
기본적으로 res.set('Content-Type', type)과 동등하지만 슬래시 없는 문자열을 매개 변수로 넘기면 이를 확장자로 간주하고
대응하는 인터넷 미디어 타입으로 설정하는 추가 기능이 있다.
예를 들어 res.type('txt')은 Content-Type을 text/plain으로 설정한다.
종류가 다른 멀티미디어 파일들을 자동으로 서비스할 때 등 이런 기능이 유용할 때도 있지만, 일반적으로 정확한 인터넷 미디어 타입을 명시적으로 설정하는 편이 좋다.
res.format(object)
Accept 요청 헤더에 따라 다른 콘텐츠를 전송할 수 있는 메서드. 주로 API에서 쓴다.
res.attachment([filename]), res.download(path, [filename], [callback])
클라이언트에게 파일을 표시하지 않고 다운로드 받으라고 전송한다.
filename을 주면 파일 이름이 명시되며, res.attachment는 헤더만 설정하므로 다운로드를 위한 node 코드가 따로 필요하다.
이 두 메서드는 모드 응답 헤더 Content-Dispostion를 attachment로 설정한다.
이 값은 브라우저에서 콘텐츠를(화면에) 표시하지 않고 내려받으라는 뜻이다.
filename을 브라우저에 힌트로 제공할 수 있다.
res.download는 내려받을 파일을 지정할 수 있지만, res.attachment는 헤더를 설정할 뿐이므로 콘텐츠를 클라이언트에
전송하는 코드가 따로 필요하다.
res.sendFile(path, [options], [callback])
path의 파일을 읽고 그 콘텐츠를 클라이언트에 전송한다.
static 미들웨어를 쓰고 클라이언트로 보낼 파일은 public 디렉터리에 넣으면 돼서 별로 쓸 필요가 없다.
하지만 같은 URL에서도 조건에 따라 다른 자원을 전송한다면 이 메서드가 편리할 수 있다.
res.links(links)
Links 응답 헤더를 설정한다.
res.locals, res.render(view, [locals], callback)
res.locals는 뷰를 렌더링 하는 기본 콘텍스트를 포함하는 객체
res.render는 템플릿 엔진을 사용하여 뷰를 렌더링 한다.
res.render의 기본 응답 코드는 200이다. 다른 응답 코드를 쓰려면 res.status를 사용하면 된다.
res.render - ejs
res.render는 ejs 템플릿 및 ejs 템플릿에서 활용할 데이터를 보내게 된다.
ejs에서는 <% %>, <%= %> 등을 활용해서 res.render가 보내준 데이터를 활용한다.
app.set를 통해 view engine을 ejs로 설정하면, res.render의 첫 번째 인자로 오는 파일 이름에 ejs 확장자를 생략해도 된다.
또한, es6에서는 아래처럼 { data : data }가 아니라 { data }로 표현할 수 있다.
app.set('view engine', 'ejs');
app.get('/', function(req, res){
var data = { name: 'John', age: 20 };
res.render('index', { data : data });
});
// index.ejs
<h1>Hello</h1>
<p>My name is <%= data.name %> and I am <%= data.age %> years old!</p>
참고사이트
https://luckyyowu.tistory.com/346
https://promobile.tistory.com/367