게시글

etc - 9달 전 등록 / 10일 전 수정

Node.js 교과서 오타&오류 정오표

조회수:
0

발견된 오류&오타는 여기에 등록됩니다. 발견된 오타&오류는 증쇄할 때마다 수정됩니다. 예를 들어 1쇄 때 발견된 오류는 2쇄 때 수정돼서 판매됩니다. 책이 몇 쇄인지에 관한 정보는 2쪽에서 보실 수 있습니다. 중대한 에러는 빨간 색으로 표시해두었습니다.

bcrypt가 설치되지 않는 분들은 https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions#microsoft-windows 를 참고하세요. 

시퀄라이즈 5버전부터는 find가 작동하지 않기 때문에 findOne으로 수정하셔야 합니다. 또는 시퀄라이즈 4버전을 설치하시면 됩니다.

4쇄에서 수정될 사항

  • bcrypt@3.0.4 사용하기
  • 시퀄라이즈 모든 find -> findOne
  • 199쪽 body-parser 요청의 분문 -> 요청의 본문
  • 200쪽 cookie-parser 설명 명확하게 수정
  • 292 include 옵션에서 models 속성에는 -> include 옵션에서 model 속성에는
  • 363 6.6.3절 -> 7.6.3절
  • 451 달려졌 -> 달라졌
  • 546, 555쪽 meta chart -> meta charset
  • 16장 서버리스 이미지들과 S3 권한 부분(버킷에 퍼블릭 정책이 있는 경우 퍼블릭 액세스 계정 및 계정간 액세스 차단 체크 해제)

3쇄에서 수정된 사항

  • 목차 encodeURLComponent, decodeURLComponent가 아니라 encodeURIComponent, decodeURIComponent입니다.
  • 138쪽 보라색 선이 쿠키를 가지지 않은 상태고, 검은 선이 쿠키를 가진 상태입니다.
  • 144쪽 쿠키 파싱 코드가 이해를 돕기 위해 간소화되었습니다. 링크 참조 
  • 익스프레스 에러 핸들러의 매개변수는 err, req, res, next 네 개여야 합니다. 또한 11, 12, 13장의 views 폴더에 9장 views/error.pug를 복사해서 넣어주세요.
  • 239쪽 brew install mysql@5.7
  • 239쪽 우분투 GVI -> 우분투 GUI, sudo apt-get install mysql-server-5.7
  • 279쪽 tag.setPosts 대신 tag.addPosts (setPosts해도 되긴 합니다만, addPosts는 등록, setPosts는 수정의 의미가 강합니다)
  • 272쪽 models 폴더 내 파일들을 만들 때, 한글 에러가 난다면 15.1.2를 참고하여 collate와 charset 옵션을 추가하세요. 기존에 테이블을 만드셨던 분들은 데이터베이스 테이블을 지우고 다시 서버를 실행하셔야 합니다. 시퀄라이즈 모델을 수정한다고 데이터베이스가 자동으로 변경되지 않습니다. 
  • [].forEach.call 또는 Array.prototype.forEach.call 코드들을 그냥 document.querySelectorAll().forEach로 수정합니다. querySelectorAll은 forEach를 지원합니다. IE에서는 forEach가 안 돼서 예전 코드로 하셔야 합니다.
  • 360쪽 email 옵션의 allowNull을 true로 수정합니다. 카카오가 더는 이메일을 필수로 제공하지 않습니다. 기존에 false로 하셨던 분들은 데이터베이스 테이블을 지우고 다시 서버를 실행하셔야 합니다. 시퀄라이즈 모델을 수정한다고 데이터베이스가 자동으로 변경되지 않습니다.
  • 365쪽 const pageRouter = require('./routes/page')입니다.
  • 412쪽 마지막 줄 "이 부분은 다음 절에서 작성합니다"가 다음 절에 없기 때문에 이 코드 를 참조해서 수정해주세요.
  • 414쪽 const request = async (req, api) => { 부분의 윗줄 공백에 axios.defaults.headers.origin = 'http://localhost:8003'을 추가하는 게 좋습니다(책 내용 흐름만으로는 에러가 나지 않지만 nodebird-call의 다른 라우터에 접근할 때 문제가 될 수 있습니다). 위 항목 링크를 참조하세요.
  • 426쪽 http://localhost:/8003 -> http://localhost:8003
  • 475쪽 package.json scripts의 start 속성 끝에 콤마 제거(JSON은 끝 콤마를 허용 안 합니다)
  • 588쪽 sudo i -g n -> sudo npm i -g n

아래 오류&오타는 2쇄에서 모두 수정되었습니다.

  • 33p 첫 줄 알아보겠습다. -> 알아보겠습니다. 
  • 145쪽 두 번째 줄 charset:utf-8 -> charset=utf-8
  • 185쪽 두 번째 줄 packgage.json -> package.json
  • 352쪽 -const isFollowing 부분 코드가 -const follow = user && user.Followings.map(f => f.id).includes(twit.user.id);
    if user && user.id !== twit.user.id && !follow로 수정되었습니다.
  • 444쪽 room.js 코드 defaultValue: 10 -> default: 10
  • 493쪽 socket.js 코드 오류입니다. https://github.com/ZeroCho/nodejs-book/blob/master/ch12/12.3/node-auction/socket.js로 수정하시거나, socket.js의 코드 부분을 app.js의 마지막에 붙여 넣으세요.(이 경우, webSocket(server, app)은 지우세요)
  • 7월 16일부로 Google Maps Platform이 유료가 됨에 따라 13장 node-place는 15.5의 결제 계정 등록(node-place에 결제 계정을 등록합니다)이 필요하게 되었습니다. (결제 계정만 등록할 뿐 무료 200$를 주긴 합니다)
투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

20개의 댓글이 있습니다.
5시간 전
안녕하세요
너무 초보적인 질문드립니다. ㅠㅠ

전자책 기준으로 136p
쿠키와 세션 이해하기 예제파일입니다.

예를 들어 쿠키가 'mycookie=test;year=1994' 같은 문자열 형식으로 왔을때
{name:'zerocho', year:'1994'}와 같이 객체로 바꾸는 함수라고 해주셨는데요

const parseCookies = (cookie = '') => cookie
.split(';')
.map(v => v.split('='))
.map(([k, ...vs]) => [k, vs.join('=')])
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURLComponent(v);
return acc; }, {});

이 함수에서 'mycookie=test;year=1994'를 매개변수로 넣었을때

.split(';') // ["mycookie=test", "year=1994"]
.map(v => v.split('=')) // [["mycookie", "test"], ["year", "1994"]]

까지는 알겠습니다. 그런데

.map(([k, ...vs]) => [k, vs.join('=')]) // 변한거 없음

메서드를 호출해도 위에 값과 달라지는게 없습니다....
왜 그런건가요..?ㅠㅠ
혹시
.map(([k, ...vs]) => [k, vs].join(':'));
를 넣어야 하는 것은 아닌가요?

이 부분에서 이렇게 헤맬정도면 자바스크립트 다시 공부하는게 나을까요...?ㅠ
25일 전
9장 nodebird Oauth 카카오 인증 중에 DB가 잘못된 듯 하여 한참을 헤메다가
정오표를 보고 이제야 수정합니다. allowNull을 false 에서 true로 변경하는 것은 알겠는데

db 테이블을 지웠다가 서버를 다시 실행시키는 방법에서 헤메고 있습니다.

스택오버플로에서 참고한 방식으로 처리하면

index코드에서 관계부분 다음라인에

// db.User.destroy({
// where: {},
// truncate: true
// })
처리를 했는데요, 이걸 N:M 처리 한 부분까지 전부 다 해야하는건지...
유저만 지우는게 아닐 것 같아서 db.Post.destroy 했는데
destory는 메서드가 아니라네요 허허
에러가 점점 쌓이네요

이부분 어떻게 DB를 비우는지 추가적인 설명 바랍니다.

굉장히 치명적인 것 같은데 다른분들은 질문을 안올리신 듯하여 올려봅니다.
24일 전
디비 테이블을 완전히 삭제하셔야합니다. destory는 디비 테이블 내용물을 지우는거고요. 명령 프롬프트에서 SQL문으로 지우시거나, 워크벤치를 통해서 지우셔야합니다. 251쪽 DROP TABLE 명령으로 지우시면 됩니다. 그 후에 서버를 재시작하세요.
한 달 전
363쪽 주석(?) 2번 에서 N:M 관계 6.6.3 절에서 다뤘다고 해서 다시 보려고 갔는데 7.6.3 이네요
한 달 전
아아 감사합니다 ㅠㅠ
한 달 전
10장 400쪽의 routes/index.js 에서 User.findOne({ where: {id: req.user && req.user.id} })가 동작 가능한지 물어보고 싶습니다. WHERE parameter "id" has invalid "undefined" value 라는 오류가 뜨면서 안되더라구요
한 달 전
req.user.id가 undefined인 것 같습니다. 이걸 하려면 먼저 if (req.user) 이런 걸로 감싸서 현재 로그인되어있는지부터 확인해야할 것 같습니다.
한 달 전
감사합니다 해결됬어요!
2달 전
9.5 프로젝트 마무리하기 routes/post.js 코드 마지막쪽에 module.exports = router; 가 두번 쓰여있네요!
2달 전
안녕하세요! 열심히 공부하고 있습니다. 좋은 책 써주셔서 너무 감사드립니다.
다름이 아니라 궁금한 게 있어서요. 제가 ebook을 사용하는데 페이지 넘버가 표시가 안되서요 단서로 말씀드릴게요
7장에서 routes/comments.js를 작성한 후에 밑에 보라색 설명부분 1번에
"include 옵션에서 models 속성에는" 이라고 되어있는데 코드는 model이라고만 되어있더라고요. 그래서 models라고 코드에 적어야 하나 인터넷에 검색해보니까 코드에 model이라고 쓰는건 맞는 것 같네요.
그래서 밑에 설명부분의 models라는 게 오타인지 궁금해서요! 감사합니다!
2달 전
아.. model 맞습니다. 오타 확인해보고 그 부분 수정하도록 하겠습니다 ㅠㅠ 감사합니다
3달 전
p101, p102 소스 결과부분
----------------------------------------------------------------------------
searchParams:
URLSearchParams {Symbol(query): Array(8), Symbol(context): URL}
searchParams.getAll():
Array(2) ["nodejs", "javascript"]
searchParams.get(): 10
searchParams.has(): true
searchParams.keys():
URLSearchParams Iterator {Symbol(context): Object}
searchParams.values():
URLSearchParams Iterator {Symbol(context): Object}
Array(1) ["es6"]
Array(0) []
searchParams.toString(): page=3&limit=10&category=nodejs&category=javascript
------------------------------------------------------------------------------
키와 값 자체는 for문으로 확인이 가능한데,Iterator가 작동하지 않는것 같습니다..
getAll() 메소드 같은 경우에도 교재의 콘솔결과창에는 JSON 타입으로 나오는것 같은데,
실제로는 JSON 타입이 아니라 배열로 들어가네요.. 버전의 문제인지?
해결법이 있습니까?
3달 전
배열도 JSON입니다. Array(2) 이 표시는 별로 중요한 게 아닙니다. 그리고 keys와 values 이터레이터 잘 작동합니다. const key = myURL.searchParams.keys(); key.next(); 해보세요~
3달 전
546쪽 template.js 소스에서
...
<const htmlTemplate = `<!DOCTYPE html>
...
<head>
<meta chart="utf-8" />
이라고 되어있는데, meta charset으로 수정해야 할 것 같습니다.
3달 전
아.. 감사합니다 ㅠㅠ 오픈챗으로 연락주시면 인프런 할인쿠폰 50%라도 하나 드리겠습니다. 문화상품권도 하나 드릴게요.
3달 전
아닙니다~~ 마음만 받겠습니다 ㅋ
3달 전
전자책으로 구매했는데 전자책으로는 오탈자가 다 수정된 채로 다운로드되는건가요? 아니면 따로 해야되나요? 하는 방법은있는지 궁금합니다!
3달 전
주기적으로 오타가 수정되는 걸로 알고 있습니다. 3쇄가 나오면 전자책도 바로는 아니더라도 오타가 수정됩니다. 다운로드만 새로 하셔야 할 수도 있습니다.
4달 전
474~475쪽 package.json 코드에서
"scripts" 안의 "start": "nodemon app" 다음에 콤마를 지워야 할 것 같습니다.
4달 전
항상 감사합니다 ㅠㅠ
4달 전
144page 맨 윗줄 책하고 소스코드 하고 다른점, 소스코드로 하면 정상실행. 저는 실력이 부족해서 모르겠네요 ^^;
4달 전
아 3쇄에서 그 부분이 빠질 예정입니다. 실제로 없어도 잘 동작합니다.
4달 전
9.4의 384쪽에 routes/page.js 코드에서
Post.findAll({ 아래의
include: 부분의 들여쓰기가 조금 잘못되었네요. 사소한 거지만, 제보 드립니다 ㅎ
4달 전
감사합니다. 다행히 코드 실행에는 문제 없는 부분이네요
4달 전
15.1.9.2(588페이지)에서
sudo i -g n이 아니라
sudo npm i -g n인 것 같습니다.
4달 전
앗 죄송합니다 ㅠㅠ 3쇄에서 반영하겠습니다.
7달 전
365p app.js 소스에
...const page = require('./routes/page');
으로 나왔는데 이전 app.js 소스하고 깃허브에 올리신 소스에는 pageRouter라고 되어 있습니다.
6달 전
감사합니다 ㅠㅠ 그리고 죄송합니다.
8달 전
226p. 8번째줄, 오른쪽의 req.app.get(키)가 app.get(키)가 되어야 할 것 같습니다. 설명은 그런데, 적혀있는건 다른게 적혀있네요.
8달 전
req.app.get(키)와 app.get(키)는 기능이 같습니다. req.app.get(키)는 라우터에서 가져오는 방법입니다. 11장에서 이 코드를 많이 사용하므로 그 부분 보시면 되겠습니다~
8달 전
아 그런데 예시는 좀 혼동이 되게 적혀있긴 하네요. 틀린 말은 아닙니다 ㅠㅠ 이 부분은 증쇄할때 설명 좀 수정하겠습니다
8달 전
한글이 참 어렵네요. 다시 읽어보니, 결국은 맞는 말인데, 문맥에 따라서 애매하게 해석될 수 있어서, 처음 읽었을 때는 오타라고 생각했습니다. 빠른 피드백 감사합니다!
8달 전
전자책 방금 구매했습니다! 열심히 보겠습니다~! 그런데 오타수정은 전자책에도 주기적으로 반영되어 업데이트되나요??
8달 전
지금까지 발견된 오타는 수정되었을 건데요. 나머지 오타는 주기적으로(전자책에 반영되는데 조금 시간이 걸립니다)
8달 전
185p 위에서 두번째 줄에 'packgage.json' 이라고 되어있습니다.
8달 전
감사합니다. ㅠㅠ
9달 전
60P relationship1,2객체 마지막 원소 끝에(logFriends) , 붙어있습니다.
visual sutudio code에는 잘 동작하는데 오타 인거 같습니다.
9달 전
오타 아닙니다~
9달 전
68p 프런트엔드 자바스크립트 장에 ajax 샘플코드들을 실제로 수행해보면 모두 CORS관련 오류들이 뜹니다. 실제로 동작하는 주소라 콘솔에서 결과를 받을 수 있다고 씌여져 있지만 크로스 싸이트 오류때문에 에러가 뜹니다. 추가 헤더가 필요할 것 같습니다.
9달 전
zerocho.com의 콘솔에서 치셔야 할겁니다. 죄송합니다 ㅠㅠ
9달 전
앗 다시 보니까 69쪽에 POST 요청 시 CORS 에러가 뜨니 10.7을 참고하시라고 적어두었네요.
9달 전
oops 그러네요? ^^ 이제야 확인했습니다.
9달 전
33p
첫줄 오타 -> 알아보겠습다.
9달 전
감사드리고, 죄송합니다. ㅠㅠ