[node] 익스프레스(express)웹 서버 만들기
by 한만섭
express 프로젝트 만들기
expres-generator 설치
sudo npm i -g express-generator
express project 생성
–view 옵션은 pug를 통해 html코드를 대신 작성하겠다는 뜻입니다.
express express-study --view=pug
bin/www파일
var app = require('../app');
var debug = require('debug')('express-study:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
app을 사용해서 http.createServer를 통해 app을 실행시킵니다.
포트번호도 사용자가 정의한 포트가 없다면 3000번 포트로 서버를 실행시킨다고 적혀있습니다.
그렇다면 app이 어떻게 작성되어있는지 알아보겠습니다.
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');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
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');
});
module.exports = app;
전체적으로보면 많은 모듈들을 사용하고 있으며 app.set()
과 app.use()
를 많이 사용하고 있는 것을 확인할 수 있습니다.
해당 함수들은 모두 미들웨어입니다. 미들웨어란 요청이들어오고 응답하기 전까지 중간에서 처리해주는 부분입니다. 데이터를 가공한다던지, 요청이 유효한 요청인지 판단을 할 수도 있습니다.
express에서는 get과post에 대한 처리도 app.get()
, app.post()
로 작성합니다. 이것 또한 GET메서드와 POST메서드에서만 동작하는 미들웨어라고 생각하시면 express가 미들웨어로 동작하는 것에 대한 이해가 더 잘 될 것입니다.
만약에 서버를 직접 만든다면 아래처럼 만들 수 있습니다. (express-generator로 만든 express에는 node-modules 가 없기 때문에 npm i
를 통해 모듈을 설치해야합니다. )
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("hello express");
});
module.exports = app;
express
모듈을 사용해서 app을 만들고 http서버에서 했던 것과 비슷하게 url 에 대해서 처리를 해주면 됩니다.
미들웨어 사용해보기
app.set()
: 익스프레스 설정 또는 값 저장
app.use()
: 미들웨어 장작
app.get()
: GET메서드만 처리하는 미들웨어
app.post()
: POST메서드만 처리하는 미들웨어
위와 같은 형태로 미들웨어를 사용할 수 있습니다. 그러면 직접 미들웨어를 만들어서 사용해보겠습니다.
const express = require("express");
const app = express();
//middleware
app.use((req, res) => {
console.log("첫번째 미들웨어");
});
app.use((req, res) => {
console.log("두번째 미들웨어");
});
app.get("/", (req, res) => {
res.send("hello express");
});
app.post("/", (req, res) => {});
module.exports = app;
위 상태에서 서버를 실행시킬 경우 아래처럼 첫번째 미들웨어만 동작을합니다.
첫번째 미들웨어
미들웨어를 넘어가기 위해서는 세번째 인자로 들어오는 next를 실행해야합니다.
const express = require("express");
const app = express();
//middleware
app.use((req, res, next) => {
console.log("첫번째 미들웨어");
next();
});
app.use((req, res) => {
console.log("두번째 미들웨어");
});
app.get("/", (req, res) => {
res.send("hello express");
});
app.post("/", (req, res) => {});
module.exports = app;
첫번째 미들웨어
두번째 미들웨어
익스프레스 404 및 에러 처리
404 NOT FOUND
app.use((req, res) => {
res.status(404).send("not found");
});
**에러처리 **
app.use((req, res, next) => {
console.log("첫번째 미들웨어");
try {
throw new Error("에러 투척");
} catch (err) {
next(err);
}
});
// 500 error
app.use(function(err, req, res) {
console.log(err);
res.status(500).send("server error");
});
미들웨어 꿀팁
- REST API에서는
res.json
을 통해 데이터를 응답한다. app.set()
을 하면app.get()
을 통해 접근할 수 있다.res.render()
에 변수를 넣는 방법 말고도res.locals
에 변수를 넣어놓으면 다른 미들웨어에서도 사용가능하다.
익스프레스 서버를 만드는 흐름
- 미들웨어
- 라우트 마들웨어
- 404미들웨어
- 에러처리 미들웨어
Subscribe via RSS