티스토리 뷰
노드 js의 비동기 실행 예시
- 아래 코드는 createServer의 콜백 함수 내부이다. 해당 조건문을 들어갔다면 req.on의 콜백함수들을 먼저 실행하는 게 아니라, req.on의 콜백함수들을 내부적으로 먼저 등록해놓고, 그 아래의 코드부터 실행해준다.
- 따라서 res.setHeader와 res.end가 아래에서 먼저 실행되고 그 후 콜백함수 내의 리다이렉션이 실행되므로 에러가 난다.
// createServer 콜백함수 내부
if(url ==='/message' && method === 'POST' ){
const body=[];
req.on('data', (chunk)=>{
console.log(chunk);
body.push(chunk);
});
req.on('end' , ()=>{ // 해당 콜백 함수는 내부적으로 등록되고 추후에 실행됨
const parsedBody = Buffer.concat(body).toString();
const message = parsedBody.split('=')[1];
fs.writeFileSync('message.txt', message);
res.statusCode=302;
res.setHeader('Location', '/'); // 2) 따라서 이 부분에서 setHeader를 불러올수 없다는 에러가 난다
return res.end();.
});
}
// 1) 이 부분이 먼저 실행됨
res.setHeader('Content-Type', 'text/html');
res.write( '<html>');
res.write( '<head><title>Hello!</title> </head>');
res.write( '<body><h1>hello from node js </h1></body>');
res.write( '</html>');
return res.end();
- 만약 콜백 함수 내부에서 파일 저장을 마친 후, 리다이렉션을 수행하고 싶다면 아래와 같이 해당 메서드 자체를 return 해주면 된다.
- 어떠한 코드가 콜백함수의 내용을 모두 실행 후 동작되길 원한다면 콜백함수에 포함시켜야한다.
// createServer 콜백함수 내부
if(url ==='/message' && method === 'POST' ){
const body=[];
req.on('data', (chunk)=>{
console.log(chunk);
body.push(chunk);
});
return req.on('end' , ()=>{ // 1) 이부분이 먼저 실행되고, 아래는 실행되지 않음
const parsedBody = Buffer.concat(body).toString();
const message = parsedBody.split('=')[1];
fs.writeFileSync('message.txt', message);
res.statusCode=302;
res.setHeader('Location', '/');
return res.end();
});
}
res.setHeader('Content-Type', 'text/html');
res.write( '<html>');
res.write( '<head><title>Hello!</title> </head>');
res.write( '<body><h1>hello from node js </h1></body>');
res.write( '</html>');
return res.end();
'web : back-end > node js' 카테고리의 다른 글
[node js] Express: 미들웨어를 통해 다른 path(route) 처리하기 (0) | 2020.06.15 |
---|---|
[node js] 노드 js의 이벤트 루프 구조 (0) | 2020.06.14 |
[node js] POST로 받은 데이터를 파싱하여 파일에 저장하기 , ReDirection (0) | 2020.06.14 |
[node js] 노드 js 리퀘스트와 리스폰스 기초 url, setHeader , write (0) | 2020.06.14 |
[node js] 노드 js 서버 만들기 (0) | 2020.06.14 |
댓글