1. 일반적인 웹서비스
express 로 웹서비스를 작성할때, 보통은 다음과 같이 작성하게 된다. express를 정의하고 router를 정의한 뒤, app.listen을 통해서 3000번 포트로 서비스를 기동한다.
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
success: true,
});
});
app.listen(port, () => {
console.log(`server is listening at localhost:${process.env.PORT}`);
});
2. 미들웨어와 라우터 차이
app.use 는 미들웨어로 불리고, app.get, app.post 는 라우터라고 말한다.
미들웨어 app.use로 '/' 경로를 정의하면 모든 요청을 다 실행하도록 하는 미들웨어로 만들수 있다. 즉, '/', '/a', '/a/b' 와 같은 모든 경로로 요청이 왔을때 서비스를 한다.
라우터 app.get, app.post로 정의를 하면 정의된 경로를 정확하게 호출한 경우만 서비스가 된다. 예를들어 '/a'로 선언하면 '/a'로 호출된 경우만 서비스되고 다른 경우에는 모두 서비스를 할 수 없다.
# 미들웨어 정의 : / 로 시작하는 모든 요청에 대해 서비스
app.use('/', (req, res) => {
res.json({
success: true,
});
});
# 라우터 정의 : /a 로 요청하는 경우에만 서비스
app.get('/a', (req, res) => {
res.json({
success: true,
});
});
3. 미들웨어에 라우터를 등록하는 방법
라우터를 활용하여 웹서비스 경로를 많이 만들게 되면 하나의 화일이 너무 복잡 해진다. 그래서 라우터의 묶음을 별도의 파일로 만들고, 라우터를 미들웨어에 등록할 수 있다.
router1.js : about, list라는 두개의 서비스를 제공하는 router작성하고, routers 폴더에 저장한다.
let express = require('express')
let router = express.Router()
router.get('/about', (req, res) => {
res.json({
success: true,
});
});
router.get('/list', (req, res) => {
res.json({
success: true,
});
});
module.exports = router
app.js : 메인 프로그램에서 router1.js 파일의 라우터를 변수에 담아 app.use의 두번째 인수로 넘긴다. 즉 /info로 시작하는 모든 요청은 infoRouter (router1.js)에서 처리하게 끔 할 수 있다. router1에 정의된 서비스 about, list 는 각각 /info/about, /info/list 로 요청했을때 서비스 된다.
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
var infoRouter = require('./routes/router1');
app.use('/info', infoRouter);
app.listen(port, () => {
console.log(`server is listening at localhost:${process.env.PORT}`);
});
4. 미들웨어에 라우터를 동적으로 등록하는 방법
프로젝트를 진행하는 과정 중에 미들웨어와 라우터가 계속 추가 되거나 변경될때마다 3번에서 처럼 별도로 추가를 해줘야 한다면 여간 번거로운 일이 아닐 수 없다. 즉, routes에 저장되어 있는 모든 js 파일들이 동적(자동)으로 미들웨어(app.use)에 등록될 수 있도록 하면 정말 편리하다. 각 미들웨어의 path는 js파일의 파일명으로 등록할 수 있다.
아래의 코드는 __dirname+'/routes' 경로 안에 있는 모든 파일을 읽어 그중 js확장자를 가진 모든 파일의 이름은 경로로 파일은 미들웨어로 등록하는 예제이다. 재시작하면 무조건 routers의 모든 파일을 다시 읽어들여 간단하게 서비스가 가능하다.
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
// routes 폴더 안 전체 모듈 로딩(경로는 파일명)
require('fs').readdirSync(__dirname+'/routes').forEach(function(file){
if(file.match(/\.js$/) !== null){
var name = file.replace('.js','')
exports[name] = require(__dirname + '/routes/' + file)
app.use('/'+name, exports[name])
}
})
app.listen(port, () => {
console.log(`server is listening at localhost:${process.env.PORT}`);
});
'Programming > NodeJS' 카테고리의 다른 글
NodeJS max-http-header-size 설정 ( 431 Request Header Fields Too Large 오류 ) (0) | 2024.10.29 |
---|---|
React JS 처음 시작해보기 (2) | 2024.06.04 |
ReactJS 소스 Decompile 방법 (0) | 2024.06.04 |