express 모듈은 node.js로 웹 서버를 개발할 때 가장 많이 쓰이는 모듈이다. 물론 http 모듈을 통해 웹 서버를 개발해도 되지만 express 모듈은 훨씬 쉽고 편하게 개발할 수 있게 해준다.

 

const express = require('express');

const app = express();

app.use((request, response) => { //get() 함수를 통해 URI로 호출되면 해당 로직이 실행된다.
response.send('Hello express module');
});

app.listen(3000, () => { //서버를 동작시킴
console.log('Server is running port 3000!');
});

 

Express-generator

* 익스프레스 프레임워크는 많은 의존성 패키지를 요구하는데 이것을 찾아 설치하기는 조금 어렵다. 그러므로 package.json을 만들어주고 기본 폴더 구조까지 잡아주는 패키지가 만들어졌는데 그것이 Express-generator 다.

해당 패키지는 콘솔 명령어로 실행 하므로 npm 전역 설치가 필요하다.

npm install -g express-generator

 

익스프레스 프로젝트를 생성하려면 새로 프로젝트를 만들고자 하는 폴더로 이동해서

express <프로젝트 이름> 을 입력한다.

해당 명령어는 생성된 폴더 및 파일명을 출력해주며 다음에 입력해야할 명령어를 알려준다.

프로젝트 이름으로 생성된 폴더로 이동한후 npm i 를 입력하면 프로젝트 폴더내에 생성된 package.json 에 명시된 패키지들이 설치된다.

 

--view=pug

* 프로젝트에서 사용할 템플릿 엔진을 설정한다. ejs를 사용하고 싶다면 pug 대신 ejs를 입력하면 된다. 

 

생성된 폴더 구조

* 라우터를 컨트롤러라고 본다면 MVC(모델-뷰-컨트롤러) 패턴과 비슷하다. 

생성된 폴더 및 파일

app.js 서버 역할
bin/www

* 서버를 실행하는 스크립트로 http 모듈에 express 모듈을 연결하고 포트를 지정하는 역할을 맡는다.
* js 확장자가 붙어있지 않다.
* #!/usr/bin/env node 라는 주석이 첫 줄에 달려있는데. www 파일을 콘솔 명령어로 만들때 이 주석을 명령어로 쓸수있다.



public 외부(브라우저 등의 클라이언트)에서 접근 가능한 파일들을 모아두는 폴더. 이미지, 자바스크립트, css 파일들이 들어있다.
routes 주소별 라우터들을 모아둔 폴더. 서버의 로직이 담긴 파일은 이곳에 담긴다.
views 템플릿 파일을 모아둔 폴더. 화면에 보이기 위한 파일을 담는다.
models 데이터 파일을 담아두는 폴더.

bin/www

/**
 * Module dependencies.
 */
 
/*app, debug, http 모듈을 가져온다.*/
var app = require('../app');
var debug = require('debug')('test-project:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

/*
서버가 실행될 포트를 설정.
process.env 객체에 PORT 속성이 있다면 그 값을 사용하고 없다면 기본값으로 3000번 포트를 이용한다.
app.set(키, 값)을 사용해서 데이터를 저장할수있으며 app.get(키) 로 가져올 수 있다.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

/*http.createServer에 불러온 모듈을 넣어준다. app 모듈이 createServer 메소드의 콜백함수 역할을 한다.*/
var server = http.createServer(app);

/**
 * Listen on provided port, on all network interfaces.
 */

/*listen을 시작. http 웹 서버와 동일하지만 익스프레스는 콜백함수 부분을 조금 다르게 만든다.*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

/*express 패키지로 객체 생성. 이 변수에 각종 기능을 연결한다.*/
var app = express();

// view engine setup
/*app.set 메서드로 익스프레스 앱을 설정할 수 있다.*/
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

/*app.use를 사용해서 미들웨어를 연결한다.*/
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

/*app 객체를 모듈로 만들어 반환한다. 이것이 bin/www에서 사용된다.*/
module.exports = app;

package.json 을 보면 scripts에 start 속성이 있고 속성값으로 node ./bin/www 가 적혀있다. 따라서 npm run start 나 npm start 명령어로 서버를 실행할 수 있다.

 

 

 

- response -

const express = require('express');

const app = express();
 
/*

app.get('위치')를 지정할 수 있다.

send() 메소드에 객체로 입력했기 때문에 JSON 형식으로 출력된다.
*/
app.get('/', (request, response) => {
const result = [];
const multipleNumber = 9;
for (let i = 1; i < 5; i++) {
result.push({
number: `${multipleNumber}X${i}`,
multiple: multipleNumber * i,
});
}
response.send(result);
});
 
/*status() 메소드를 활용해 상태 코드를 전달한다.*/
app.get('/error', (request, response) => {
response.status(404).send('404 ERROR');
});

app.listen(3000, () => {
console.log('Server is running port 3000!');
});

 

response 객체의 메소드

 res.download() 

파일이 다운로드되도록 프롬포트 한다. 

 res.end()

응답 프로세스를 종료한다. 

 res.json()

JSON응답을 전송한다. 

 res.jsonp()

JSONP 지원을 통해 JSON 응답을 전송한다. 

 res.redirect()

요청의 경로를 재지정한다. 

 res.render()

템플릿을 랜더링한다. 

 res.send()

다양한 유형의 응답을 전송한다.(문자열 HTML, 객체 JSON, 배열 JSON의 형태로) 

 res.sendFile

파일을 전송한다. 

 res.sendStatus()

응답 상태 코드를 설정한 후 해당 코드를 문자열로 표현한 내용을 응답 본문으로 전송한다. 

 

 

 

- request -

// 요청 메서드
const express = require('express');

const app = express();

app.use((request, response) => {
/*요청 헤더를 추출. 웹 브라우저로 HTTP 요청시 User-Agent 속성값을 가지고 있다.*/
const agent = request.header('User-Agent');
 
const paramName = request.query.name; //매개변수 추출
const browserChrome = 'Hello Chrome';
const browserOthers = 'Hello Others';
 
/*request() 객체에 기본적으로 내장된 메소드*/
console.log(request.headers);

console.log(request.baseUrl);

console.log(request.hostname);
console.log(request.protocol);

 

if (agent.toLowerCase().match(/chrome/)) { //Chrome 브라우저인가?
response.write(`<div><p>${browserChrome}</p></div>`);
} else {
response.write(`<div><p>${browserOthers}</p></div>`);
}
response.write(`<div><p>${agent}</p></div>`);
response.write(`<div><p>${paramName}</p></div>`);
response.end();
});

 

app.listen(3000, () => {
console.log('Server is running port 3000!');
});

 

express 모듈의 request 객체를 이용하면 사용자가 요청(request)한 내용이 어떤 것인지 알수 있다.

request 객체를 활용하여 매개변수를 추출하고 헤더의 속성을 알아내 브라우저를 구분하여 페이지를 출력할 수 있다.

 headers 

요청 헤더의 추출

 Header() 

요청 헤더의 속성 지정 또는 추출 

 query

GET 방식으로 요청한 매개변수 확인 

 body

POST 방식으로 요청한 매개변수 확인 

 params

라우팅 매개변수 추출 

 

- 미들웨어 -

요청과 응답의 중간에 위치해 미들웨어라 불린다. 라우터나 에러 핸들러 같은 다른 로직을 실행해 요청과 응답을 조작할수있으며 기능을 추가하거나 나쁜 요청을 걸러낼수 있도록 분리된 함수이다.

 

- use -

/*
app.use 메서드의 인자로 들어 있는 함수가 미들웨어이다. 
미들웨어는 use 메서드로 app에 장착되며 장착된 순서대로 실행된후 라우터에서 클라이언트로 응답을 보낸다.
*/
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// 404 처리 미들웨어
app.use(function(req, res, next) {
  /*
  http-errors(createError) 패키지가 404 에러를 만들어내고
  이 에러를 next에 담아 아래 에러 핸들러로 보낸다.
  */
  next(createError(404));
});

// 에러 핸들러. 일반적으로 미들웨어 중 제일 아래에 위치하고 위에있는 미들웨어에서 발생하는 에러를 받아서 처리한다. 
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

 

- 커스텀 미들웨어 -

// 미들웨어 개요
const express = require('express');

const app = express();

app.use((request, response, next) => {
console.log('첫번째 미들웨어에 요청');
request.user1 = '철수';
next();
});

app.use((request, response, next) => {
console.log('두번째 미들웨어에 요청');
request.user2 = '영이';
next();
});

app.use((request, response, next) => {
console.log('세번째 미들웨어에 요청');
response.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });

response.write(`<div><p>${request.user1}</p></div>`);
response.write(`<div><p>${request.user2}</p></div>`);
response.end('<h1>express 서버에서 응답한 결과</h1>');
});

app.listen(3000, () => {
console.log('Server is running port 3000!');
});

* 위처럼 사용자가 미드웨어를 직접 만드는것도 가능하다. 단, 다음 미드웨어로 넘어가려면 next()를 호출해야한다.

* 만약 next를 넣지 않는다면 중간에 요청의 흐름이 끊겨버릴수 있다.

* next()는 인자에 따라 다른기능을 하기도 하는데

인자가 없으면 다음 미들웨어로 넘어가고

인자로 route를 넣으면 라우터 기능을 한다.

route외에 다른값을 넣으면 미들웨어나 라우터를 건너 뛰고 바로 에러 핸들러로 이동한다. 넣어준 값은 에러에 대한 내용으로 간주된다.

 

*아래처럼 하나의 use에 미들웨어를 여러 개 장착 할 수 있다. 순서대로 실행된다.

app.use('/', function(req, res, next) {
  console.log('첫 번째 미들웨어');
  next();
}, function(req, res, next) {
	console.log('두 번째 미들웨어');
    next();
}, function(req, res, next) {
      console.log('세 번째 미들웨어');
      next();
});

 

- static -

정적인 파일들을 제공해주는 미들웨어로 express에 내장되어있다.

app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser('secret code'));

함수의 인자로 정적 파일들이 담겨있는 폴더를 지정하면 되는데

public/stylesheets/styles.css 는 http://localhost:3000/stylesheets/styles.css 로 접근이 가능하다.

실제 서버의 폴더 경로와 요청 경로가 다르므로 외부인이 서버의 구조를 파악하기가 쉽지 않으며 이는 보안에 큰 도움이 된다.

// static 미들웨어
// express 모듈 불러오기
const express = require('express');

// express 객체 생성
const app = express();

app.use(express.static(`${__dirname}/multimedia`));
app.use((request, response) => {
response.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });
response.end('<img src="/newyork.jpg" width="100%"/>');
});

app.listen(3000, () => {
console.log('Server is running port 3000!');
});

 

app.use('/img', express.static(path.join(__dirname, 'public')));

위처럼 정적 파일을 제공할 주소를 지정할 수도 있다.

public 폴더 안에 abc.png 는 앞에 /img 경로를 붙인 http://localhost:3000/img/abc.png 주소로 접근 가능하다.

 

* static 미들웨어는 요청에 부합하는 정적 파일을 발견하면 응답으로 해당 파일을 전송한다. 이 경우 응답을 보냈으므로 다음에 나오는 라우터가 실행되지 않는다. 만약 파일을 찾지못했다면 요청을 라우터로 넘긴다.

* 이렇게 자체적으로 정적 파일 라우터 기능을 수행하므로 최대한 위쪽에 배치하는게 좋다.

 

- body parser -

POST나 PUT과 같은 요청을 처리할 때 사용자가 보낸 데이터를 해석해 request 객체의 body에 추가 및 할당해준다.

보통 폼 데이터나 AJAX 요청의 데이터를 처리한다.

 

express에 내장된 body-parser의 일부기능으로 다음과 같이 데이터 처리가 가능하지만

app.use(express.json());
app.use(express.urlencoded({ extended: false}));

JSON과 URL-encoded 외에 RAW, Text 형식의 본문을 추가로 해석하고싶을땐 body-parser를 사용해야한다.

Raw는 본문의 버퍼 데이터 일때, Text는 본문이 텍스트 데이터일 때 해석하는 미들웨어로 아래처럼 사용이 가능하다.

app.use(bodyParser.raw());
app.use(bodyParser.text());

JSON은 JSON 형식의 데이터 전달 방식이고, URL-encoded는 주소 형식으로 데이터를 보내는 방식이다.

보통 폼 전송이 URL-encoded 방식을 주로 사용한다.

// body parser 미들웨어

// 모듈 불러오기
const express = require('express');
const bodyParser = require('body-parser');

// express 객체 생성
const app = express();

// application/x=www-form-urlencoded 파싱.
/*
{ extended: false } 이 옵션이 false이면 노드의 querystring 모듈을 사용하여 쿼리스트링을 해석하고
true 면qs 모듈을 사용하여 쿼리스트링을 해석한다.
*/
app.use(bodyParser.urlencoded({ extended: false }));

// application/json 파싱
app.use(bodyParser.json());

app.use(express.static(`${__dirname}/login`));

app.use((request, response) => {
const userId = request.body.userid || request.query.userid;
const userPassword = request.body.password || request.query.password;

response.writeHead('200', { 'Content-Type': 'text/html;charset=utf8' });
response.write('<h1>Login ID와 PW 결과 값 입니다.</h1>');
response.write(`<div><p>${userId}</p></div>`);
response.write(`<div><p>${userPassword}</p></div>`);
response.end(JSON.stringify(request.body, null, 2));
});

app.listen(3000, () => {
console.log('Server is running port 3000!');
});

ex)

JSON 형식 { name : 'tester', book: 'nodejs' } 를 본문으로 보내면 req.body에 그대로 들어가지만

URL-encoded 형식 name=tester&book=nodejs를 본문으로 보내면 req.body에 { name : 'tester', book: 'nodejs' } 가 들어간다.

 

* body-parser가 모든 본문을 해석해는 것은 아니다. multipart/form-data 같은 폼을 통해 전송된 데이터는 해석하지 못하며 이는 다른 모듈을 사용해서 해석해야한다.

 

- cookie-parser -

요청에 동봉된 쿠키를 해석해준다.

var cookieParser = require('cookie-parser');
app.use(cookieParser());

해석된 쿠키들은 req.cookies 객체에 들어간다.

ex) { name : 'tester' }

 

인자로 문자열을 넣어줄 경우 제공한 문자열로 서명된 쿠기가 되며 서명된 쿠키는 클라이언트에서 수정했을 때 에러가 발생하게 되므로 클라이언트에서 쿠키로 위험한행동을 하는 것을 방지 할 수 있다.

 

- morgan -

요청에 대한 정보를 콘솔에 기록해주는 미들웨어

var logger = require('morgan');
app.use(logger('dev'));

인자로 dev 대신 short, common, combined 등을 줄 수 있으며 인자에 따라 콘솔에 나오는 로그가 다르다.

dev 인 경우

GET / 200 51.267 ms - 1539 의미는 순서대로

HTTP요청(GET) 주소(/) HTTP상태코드(200) 응답속도(51.267ms) - 응답바이트(1539) 이다.

short나 dev는 개발시

common 이나 combined는 배포시에 많이 쓰인다.

 

- express-session -

세션 관리용 미들웨어로 로그인 등의 이유로 세션을 구현할 때 쓴다.

express-generator로 설치되지 않으므로 npm을 통해 별도로 설치해야한다.

 

express-session 1.5 버전 이전에는 내부적으로 cookie-parser를 사용하고 있어서 cookie-parser 미들웨어보다 뒤에 위치해야 했지만, 1.5버전 이후부터는 사용하지 않게 되어 순서가 상관 없어졌다. 만약 어떤 버전을 사용하고 있는지 모르겠다면 cookie-parser 미들웨어를 뒤에 놓는 것이 안전하다.

var logger = require('morgan');
var session = require('express-session');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

app.use(cookieParser('secret code'));
app.use(session({
  /* resave 요청이 왔을 때 세션에 수정사항이 생기지 않더라도 세션을 다시 저장할지에 대한 설정 */
  resave: false,
  /* 세션에 저장할 내역이 없더라도 세션을 저장할지에 대한 설정. 방문자를 추적할 때 사용된다. */
  saveUninitialized: false,
  /* cookie-parser의 비밀키와 같은 역할 */
  secret: 'secret code',
  /*
  세션관리 시 클라이언트에 쿠키를 보내는데 이를 세션쿠키라 부른다. 
  안전하게 쿠키를 전송하려면 쿠키에서명을 추가해야 하는데 쿠키를 서명하는데 secret의 값이 필요하다. 
  cookie-parser의 secret과 같게 설정해야한다.
  아래의 cookie 옵션은 세션 쿠키에 대한 설정으로
  maxAge, domain, path, expires, sameSite, httpOnly, secure 등 일반적인 쿠키 옵션이 모두 제공된다.
  store 라는 옵션도 있는데 세션을 데이터베이스에 저장할 수 있게 해준다. 데이터베이스는 보통 레디스가 자주 쓰인다.
  */
  cookie: {
    httpOnly: true,
    secure: false,
  },
}));

- connect-flash -

일회성 메시지들을 웹 브라우저에 나타낼때 좋으며 express-generator로 설치되지 않으므로 npm을 통해 별도로 설치해야한다.

connect-flash 미들웨어는 cookie-parser 와 express-session을 사용하므로 이들보다 뒤에 위치해야한다.

var flash = require('connect-flash');

app.use(flash());

flash 미들웨어는 res 객체에 req.flash 메서드를 추가하며 req.flash(키, 값)으로 해당 키에 값을 설정하고 불러온다.

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/flash', function(req, res) {
  req.session.message = '세션 메시지';
  req.flash('message', 'flash 메시지');
  res.redirect('/users/flash/result');
});

router.get('/flash/result', function(req, res) {
  res.send(`${req.session.message} ${req.flash('message')}`);
});

module.exports = router;

/users/flash 라우터로 GET 요청을 보내면 서버에서는 세션과 flash에 미시지를 설정하고 /users/flash/result 메시지로 리다이렉트 한다. 첫 번째 /users/flash/result에는 세션 메시지와 flash 메시지가 모두 보인다.

해당 메시지는 일회성이기 때문에 새로고침시 보이지 않는다. 이러한 성질을 이용해서 로그인 에러나 회원가입 에러 같은 일회성 경고 메시지를 보낼수 있다.

 

- Router -

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

app.use('/', indexRouter);
app.use('/users', usersRouter);

라우팅 미들웨어는 첫 번째 인자로 주소를 받아서 특정 주소에 해당하는 요청이 왔을때만 미들웨어가 동작하게 할 수도 있다. 주소가 /로 시작하면 routes/index.js를, /users로 시작하면 routes/users.js를 호출하라는 의미이다.

 

use 메서드는 모든 HTTP 메서드에 대해 요청 주소만 일치하면 실행되지만 get, post, put, patch, delete 같은 메서드는 주소뿐만 아니라 HTTP 메서드까지 일치하는 요청일 때만 실행된다.

/* HTTP 메서드는 상관없이 / 주소요청일 때 실행 */
app.use('/', function(req, res, next) { next(); }
/* GET 메서드 / 주소의 요청일 때 실행 */
app.get('/', function(req, res, next) { next(); }
/* POST 메서드 /data 주소의 요청일 때 실행 */
app.post('/', function(req, res, next) { next(); }

app.use 처럼 router 하나에 미들웨어를 여러 개 장착할 수도 있다. 라우터 로직이 실행되는 미들웨어 전에 로그인 여부 또는 관리자 여부를 체크하는 미들웨어를 중간에 넣을수있다.

router.get('/', middleware1, middleware2, middleware3);

 

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  /*클라이언트에 응답을 보냄. express가 응답 객체에 추가한 메서드로 템플릿 엔진을 사용하는 부분*/
  res.render('index', { title: 'Express' });
});

module.exports = router;
var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/flash', function(req, res) {
  req.session.message = '세션 메시지';
  req.flash('message', 'flash 메시지'); //저장
  res.redirect('/users/flash/result');
});

router.get('/flash/result', function(req, res) {
  res.send(`${req.session.message} ${req.flash('message')}`); //추출
});

module.exports = router;

 

* 브라우저는 요청시 제한시간 동안 응답을 받을때까지 대기하므로 라우터에서는 요청에 대한 응답을 보내야한다.

* next 함수가 라우터에서 동작할때 매개변수로 'route'를 주면 연결된 나머지 미들웨어들을 건너뛴다. 대신 주소가 일치하는 다음 라우터로 넘어간다.

router.get('/', function(req, res, next) {
	next('route');
}, function(req, res, next) {
	console.log('실행 X');
    next();
}, function(req, res, next) {
	console.log('실행 X');
    next();
});

router.get('/', function(req, res) {
	console.log('실행 O');
    res.render('index', { title:'Express' });
}

그 외에도

router.get('/user/:id', function(req, res) {
	console.log(req.params, req.query);
});

처럼 :id를 쓰면 /users/1 같은 요청도 라우터에 걸리며 :id에 해당하는 부분을 req.params.id를 통해 조회할 수 있다.

주소에 쿼리스트링을 쓰면 쿼리스트링의 키-값 정보는 req.query 객체 안에 들어 있다.

 

ex) /users/123?limit=5&skip=10 이라는 주소의 요청이 들어오면

req.params와 req.query 객체는 { id: '123' } {limit : '5', skip: '10' } 이다.

 

단, 이러한 주소패턴을 사용하는 라우터는 일반 라우터보다 뒤에 위치해야한다. 다양한 라우터를 아우르는 와일드카드 역할을 하므로 일반 라우터보다는 뒤에 위치해야 다른 라우터를 방해하지 않는다.

 

응답 메서드는 send, sendFile, json, redirect, render를 주로 사용한다.

send 왠만한 모든 형식을 지원하며 버퍼 데이터나 문자열을 전송하거나 HTML 코드를 전송하기도 하며 JSON 데이터도 전송이 가능하다
ex) res.send(버퍼 or 문자열 or HTML or JSON)
sendFile 파일을 응답으로 보내주는 메서드이다.
ex) res.sendFile(파일 경로);
json JSON 데이터를 보내준다.
res.json(JSON 데이터);
redirect 응답을 다른 라우터로 보낸다.
ex) 로그인 완료 후 다시 메인 화면으로 돌아갈 때 res.redirect(메인 화면 주소) 를 하면 된다.
render 템플릿 엔진을 렌더링한후 결과를 전송한다.
ex) res.render('템플릿 파일 경로', { 변수 });

* 기본적으로 200 HTTP 상태코드를 응답하지만 (단, res.redirect는 302) status 메서도를 먼저 사용하면 직접 바꾸는게 가능하다.

res.status(404).send('Not Found')

* 하나의 요청에 대한 응답은 한 번만 보내야한다. 두 번 이상 보내면 에러가 발생한다.

* 라우터가 요청을 처리하지 못할 경우 404 HTTP 상태코드를 전송하는 에러 처리 미들웨어로 넘겨야한다.

// 404 처리 미들웨어
app.use(function(req, res, next) {
  next(createError(404));
});

// 에러 핸들러
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

'공부 > Node.js' 카테고리의 다른 글

이벤트  (0) 2019.04.02
쿠키와 세션  (1) 2019.04.02
로그 - winston 모듈  (0) 2019.03.08
템플릿 엔진 모듈 - ejs, pug 모듈  (0) 2019.03.07
크롤링 - cheerio, iconv-lite 모듈  (1) 2019.03.07

+ Recent posts