4. http 모듈로 웹 서버 만들기의 라우터 리팩토리 부분 질문 드립니다!

해결됨
-- 프로필

안녕하세요. 강의 잘 듣고 있습니다. 

http 모듈로 웹 서버 만들기 > 라우터 리팩토리 부분에서 

GET, POST의 경우 제대로 잘 동작하는데 PUT이나 DELETE 동작을 수행하고자 할 경우

(matchedUrl || router[req.method.toLowerCase()]['*'])(req, res);

                                                         ^

TypeError: (matchedUrl || router[req.method.toLowerCase(...)].*) is not a function

    at Server.<anonymous> (/Users/-/Desktop/code/study_nodejs/restServer.js:79:58)

    at Server.emit (events.js:210:5)

    at parserOnIncoming (_http_server.js:745:12)

    at HTTPParser.parserOnHeadersComplete (_http_common.js:115:17)

계속 위와 같은 에러가 떠서 질문 드립니다!

리팩토리 이전까지는 잘 진행되었는데 이후에 계속 같은 오류가 뜨네요 ㅠㅠ 

제가 작성한 코드는 아래에 따로 작성하겠습니다.

도움 주시면 감사하겠습니다.

-- 프로필
-- 5달 전
const http = require('http');
const fs = require('fs');
const users = {

};

const router = {
get: {
'/': (req, res) => {
return fs.readFile('./restFront.html', (err, data) => {
if (err) {
throw err;
}
res.end(data);
});
},
'/users': (req, res) => {
res.end(JSON.stringify(users));
},
'*': (req, res) => {
fs.readFile(`.${req.url}`, (err, data) => {
return res.end(data);
});
},
},
post: {
'/users': (req, res) => {
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
req.on('end', () => {
console.log('POST 본문(body)', body);
const {
name
} = JSON.parse(body);
const id = +new Date();
users[id] = name;
res.writeHead(201, {
'Content-Type': 'text/html; charset = utf-8'
});
res.end('사용자 등록 성공');
});
},
},
put: {
'/users': (req, res) => {
const id = req.url.split('/')[2];
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
return req.on('end', () => {
console.log('put', body);
users[id] = JSON.parse(body).name;
return res.end(JSON.stringify(users));
});
},
},
delete: {
'/users': (req, res) => {
const id = req.url.split('/')[2];
let body = '';
req.on('data', (chunk) => {
body += chunk;
});
return req.on('end', () => {
console.log('delete', body);
delete users[id];
return res.end(JSON.stringify(users));
});
},
},
};

http.createServer((req, res) => {
console.log(req.url);
const matchedUrl = router[req.method.toLowerCase()][req.url];
(matchedUrl || router[req.method.toLowerCase()]['*'])(req, res);
}).listen(8005, () => {
console.log('8005 번 포트에서 서버 대기 중');
});


조현영 프로필
조현영 5달 전

혹시 console.log(req.url, req.method)로 바꿔서 결과 알려주실수 있나요?

-- 프로필
-- 5달 전

처음 접속 시 :  /users GET

등록 시 : /users POST, /users GET

수정 시 : /users/1578995716632 PUT (이후 에러)

삭제 시 : /users/1578995769405 DELETE (이후 에러)

입니다!

조현영 프로필
조현영 5달 전

아 주소 뒤에 아이디가 붙어있어서 그렇습니다. 그럴때는 startsWith를 써야합니다. 사실 지금까지배운 내용으로는 조금 어려울 수 있습니다.

-- 프로필
-- 5달 전

앗 그렇군요..  말씀해주신 문제점 참고하여 코드 다음과 같이 수정했더니 이젠 잘 동작하네요..! 감사합니다!

http.createServer((req, res) => {
console.log(req.url, req.method);
const matchedUrl = router[req.method.toLowerCase()]['/'+(req.url.split('/')[1]||'')];
(matchedUrl || router[req.method.toLowerCase()]['*'])(req, res);
}).listen(8005, () => {
console.log('8005 번 포트에서 서버 대기 중');
});
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스