게시글

etc - 일 년 전 등록 / 한 달 전 수정

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

조회수:
0

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

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

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

16장 서버리스 이미지들과 S3 권한 부분도 달라졌지만, 모든 이미지를 수정할 수가 없어 글로 설명드립니다. 버킷에 퍼블릭 정책이 있는 경우, 퍼블릭 액세스 계정 및 계정간 액세스 차단 옵션의 체크를 해제해주셔야 합니다.

5쇄 또는 개정판에서 수정될 사항

  • 226쪽 development(개발 환경)인 경우에만

4쇄에서 수정된 사항

  • bcrypt@3.0.6 사용하기
  • 시퀄라이즈 모든 find -> findOne
  • +new Date()나 new Date().valueOf()를 Date.now()로 수정
  • 199쪽 body-parser 요청의 분문 -> 요청의 본문
  • 200쪽 cookie-parser 설명 명확하게 수정
  • 201 / 6.3.5 static절 styles.css -> style.css
  • 292 include 옵션에서 models 속성에는 -> include 옵션에서 model 속성에는
  • 363 6.6.3절 -> 7.6.3절
  • 400 where: { id: req.user && req.user.id || null } 로 수정(시퀄라이즈는 where에 undefined 허용 안 함)
  • 451 달려졌 -> 달라졌
  • 546, 555쪽 meta chart -> meta charset

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- 무단 전재 및 재배포 금지

댓글

30개의 댓글이 있습니다.
한 달 전
형님... kakao 로그인 기능 만들때 Redirect path를 카카오에서 더이상 지원하지 않는데.. 그냥 무시하고 진행해도 될까요??
한 달 전
밑에 질문 이어서 드리면 책에는 sequelize.define(...)이렇게 모델링하는데 이럴경우 belongsTo나 subclass 에러가 뜹니다. 하지만 return sequelize.define(...)이렇게 할경우 문제없이 되고여. 교재나 github코드로는 에러가 뜨는데 제가 잘못 이해한건가요?
한 달 전
책의 코드에도 return이 되어있습니다. => ( sequelize.define ) 이 문법은 return이 생략된 문법입니다. 혹시나 {}를 하신게 아닌가요? github 코드로 에러가 나는지 확인해보았는데 나지 않습니다. 아마 코드 상에 오타가 들어있거나 그럴 확률이 큽니다.
한 달 전
교재에서 models폴더에 있는 파일들 보면 sequelize.define할때 return을 안하던데 이러니 에러가 납니다. 그런데 return sequelize.define하면 문제가 없고여. 어떤 문제인가요?
한 달 전
제 책에는 다 return이 되어있습니다. return이 생략된 문법일 뿐이에요.
한 달 전
redis부분도 설정이 바뀌었습니다.
기존의 방식으로는 redis접근이 안됩니다
https://github.com/tj/connect-redis/blob/HEAD/migration-to-v4.md

제로초님 책 덕분에 많은걸 배우고 있습니다.
항상 감사합니다
한 달 전
넵 확인했습니다. 감사합니다!
한 달 전
p226, 4번째 줄 [error 객체는 시스템 환경이 development(개발 환경)가 아닌 경우에만 표시됩니다.] 가 아니라 개발 환경일 경우에만 표시됩니다 여야 될 것같다고 생각들어서요.
한 달 전
헉, 그렇네요. 감사합니다 ㅠㅠ
3달 전
카카오톡 ID와 회원가입한 ID가 동일한 경우 Duplicate error가 발생할 때가 있는데 이때 어떻게 해야 하나요?
3달 전
KakaoStrategy에서 그런 경우 가입을 하지 못하게 막아주어야 할 것 같네요. localStrategy에서 기존에 유저가 있는지 검사하는 부분을 그대로 사용하시면 됩니다.
3달 전
3쇄를 사거나 그 전에 산 사람들은 앞으로 개정된 바뀐 부분을 따로 볼 수 있나요?
3달 전
전자책인 경우는 가능합니다. 새로운 쇄가 나올때 업데이트됩니다.
3달 전
초판 3쇄에 p.201 / 6.3.5 static절에서 경로 설명부분에 style.css가 아니라 styles.css라고 오타가 있습니다
3달 전
아, 저 부분은 사실 틀린 말은 아니지만 예제의 파일이 style.css이기 때문에 혼동이 있을 수 있겠네요. 수정하겠습니다!
3달 전
6.5.1.5 include에 header.pug 세번째 줄 (href='/about') About 앞에 "a" 빠졌습니다
3달 전
이 부분들은 모두 전자책에서만 일어나는 현상 같습니다. 혹시 어떤 전자책 플랫폼 사용하시나요?
3달 전
리디북스 사용합니다
3달 전
6.3.1의 그림6-6에 오른쪽에 보면 son, urlencoded가 있는데 son이 아니라 json인거 같습니다
3달 전
194쪽 말씀하시는 건가요? 저는 json으로 잘 나와있습니다. 혹시 몇 쇄인가요? 2쪽에 나와있습니다.
3달 전
전자책 초판 3쇄 발행 2019년 2월 2일 입니다
6달 전
안녕하세요
너무 초보적인 질문드립니다. ㅠㅠ

전자책 기준으로 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(':'));
를 넣어야 하는 것은 아닌가요?

이 부분에서 이렇게 헤맬정도면 자바스크립트 다시 공부하는게 나을까요...?ㅠ
6달 전
일반적인 쿠키에서는 달라지는 게 없지만 쿠키가 만약 a=b=c로 오면 a: 'b=c'로 파싱해줍니다. (=이 들어갔을 때 특별하게 파싱하는 겁니다)사실 이 부분은 디테일하긴 한데 너무 어려워서 개정판에서는 코드를 제거했습니다.
7달 전
9장 nodebird Oauth 카카오 인증 중에 DB가 잘못된 듯 하여 한참을 헤메다가
정오표를 보고 이제야 수정합니다. allowNull을 false 에서 true로 변경하는 것은 알겠는데

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

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

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

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

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

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