웹/Node.js

Express 기초

ohojee 2023. 7. 27. 21:18

Express

app.get('/', (req, res) => {
	res.send('main')
}) //단순 문자열 반환
app.get('/', (req, res) => {
	res.sendFile(path.join(__dirname, 'index.html')
}) //단순 문자열이 아니라 html을 반환

 

미들웨어

app.use((req, res, next) => {
	console.log('모든 요청에 실행됩니다.')
	next() //next를 실행시키지 않으면 다음 미들웨어가 실행되지 x
})

app.get('/', (req, res, next) => {
	console.log('모든 요청에 실행됩니다.')
	next()
}, (req, res) => {
	throw new Error("에러는 에러처리 미들웨어로 감")
})

app.use((err, req, res, next) => {
	console.log(err)
	res.status(200).send(err.message) //res.status(200): http 상태코드(200은 성공)

app.use(미들웨어) 식으로 사용됨(그냥 괄호 안에 들은걸 미들웨어라고 하는듯?)
라우터와 에러핸들러도 미들웨어의 일종
주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행, 주소를 넣는다면 해당하는 요청에서만 실행

  • 에러처리 미들웨어는 매개변수 4개(err, req, res, next) 모든 매개변수가 사용되지 않더라도 반드시 4개여야 함
  • 다음 미들웨어로 넘어가려면 next 함수를 호출해야 함 ex) next(): 다음 미들웨어로, next(’route’) : 다음 라우터로, next(error): 에러핸들러로

 

이미지 업로드

app.post('/upload', upload.single('image'), (req, res) => {
  console.log(req.file);
  res.send('ok');
});
// 이미지가 하나일 때, req.file에 저장
app.post('/upload', upload.array('many'), (req, res) => {
  console.log(req.files);
  res.send('ok');
});
//이미지가 여러개일 때, req.files에 저장
app.post('/upload', upload.fields([{ name: 'image1' }, { name: 'image2' }]), (req, res) => {
  console.log(req.files);
  res.send('ok');
});
//이미지 여러개지만 input태그나 폼 데이터의 키가 다를 때, req.files.image1, req.files.image2에 각각 저장
const upload = multer({
  storage: multer.diskStorage({
    destination(req, file, done) {
      done(null, 'uploads/'); cb(null, `${ Date.now() }${ uuid }`) // done : 첫번째 인수: 에러가 있다면 에러를 넣고, 두번째 인수: 경로와 파일 이름
    },
    filename(req, file, done) {
      const ext = path.extname(file.originalname);
      done(null, path.basename(file.originalname, ext) + Date.now() + ext);
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 }, //파일 크기 5MB 이하
});


라우터 객체

//app.js
const userRouter = require('./routes/user');
app.use('/user', userRouter);

//routes/user.js
const router = express.Router();
router.get('/', (req, res) => {
  res.send('Hello, User');
});
  • /와 /user가 합쳐져 get /user 라우터가 됨 ⇒ app.use로 연결할 때 주소가 합쳐짐
  • 같은 주소의 라우터를 여러개 만들어도 됨
router.route('/abc')
.get((req, res) => {
  res.send('get /abc')
})
.post((req, res) => {
  res.send('post /abc')
})
  • 주소는 같지만 메서드가 다른 코드가 있을 때 위처럼 사용 가능