인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

Donggun Jang님의 프로필 이미지
Donggun Jang

작성한 질문수

[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지

fs로 HTML파일 읽어 제공하기

비동기 방식에서의 에러처리

작성

·

333

0

안녕하세요! 어제 유투브에서도 질문드렸었는데 잘 이해가 가지 않아 다시 질문드립니다.

184p server1-1.js

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.write('<h1>Hello Node!</h1>');
  res.end('<p>Hello Server!</p>');
});
server.listen(8080);

server.on('listening', () => {
  console.log('8080번 포트에서 서버 대기 중입니다!');
});
server.on('error', (error) => {
  console.error(error);
});

어제 이 부분 에러처리를 try/catch로 하면 안되는건지 질문드렸었는데 server함수가 비동기로 진행되는거라 try/catch 적용하면 안된다고 답변받았었습니다.

 

186p server2.js

const http = require('http');
const fs = require('fs').promises;

http.createServer(async (req, res) => {
  try {
    const data = await fs.readFile('./server2.html');
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.end(data);
  } catch (err) {
    console.error(err);
    res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
    res.end(err.message);
  }
})
  .listen(8081, () => {
    console.log('8081번 포트에서 서버 대기 중입니다!');
  });

그런데 바로 뒤에서 async를 사용하여 비동기임이 확실한데도 try/catch로 에러처리를 하신 부분이 나와서 잘 이해가 안갑니다..

뒷부분에서는 왜 try/catch를 적용해도 되는건지 궁금합니다!

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

async 함수이지만 저 콜백 함수가 실행될 때는 내부가 동기적으로 순서대로 실행됩니다. try/catch는 동기적 코드거나 await 에러만 catch할 수 있습니다

Donggun Jang님의 프로필 이미지
Donggun Jang
질문자

server1-1에서

res.writeHead와 res.write의 결과 순서가 바뀔 수 있어서 비동기인건가요??

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아뇨. on이 이벤트리스너잖아요. 이벤트리스너는 언제 호출될지 모르니 비동기이죠

Donggun Jang님의 프로필 이미지
Donggun Jang
질문자

아....놓치고있었습니다 감사합니다!

Donggun Jang님의 프로필 이미지
Donggun Jang

작성한 질문수

질문하기