게시글

etc - 3년 전 등록 / 7달 전 수정

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

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

버전 관련 문제는 여기 정리했습니다.

  • mysql 8 버전을 설치하신 분은 설치할 때 legacy authentication을 체크(비밀번호 설정할 때 있습니다)해야 비밀번호 관련 에러가 안 납니다.
  • 윈도에서 bcrypt가 설치되지 않는 분들은 https://github.com/kelektiv/node.bcrypt.js/wiki/Installation-Instructions#microsoft-windows 를 참고하세요.
  • bcrypt 5.0.1이랑 node.js 15가 호환이 안 되는 문제가 있습니다. 이 때는 node.js 14 설치하세요.
  • 시퀄라이즈 5버전부터는 find가 작동하지 않기 때문에 findOne으로 수정하셔야 합니다. 또는 시퀄라이즈 4버전을 설치하시면 됩니다. 
  • 책에서 socket.io@2 버전을 설치해야 문제가 없습니다. socket.io@4 버전 코드는 깃헙 socket.io@4 브랜치에 있습니다.  
  • 16장 서버리스 이미지들과 S3 권한 부분도 달라졌지만, 모든 이미지를 수정할 수가 없어 글로 설명드립니다. 버킷에 퍼블릭 정책이 있는 경우, 퍼블릭 액세스 계정 및 계정간 액세스 차단 옵션의 체크를 해제해주셔야 합니다. 

기타 오류/오타는 다음과 같습니다.

개정판 2쇄에서 수정될 사항

4쇄에서 미처 수정되지 못한 사항

  • 151쪽 restServer 대신 restFront.html, restFront.css, restFront.js입니다.
  • 226쪽 development(개발 환경)인 경우에만
  • 328쪽 몽구스가 생성하는 쿼리 내용을 개발환경일 때만 콘솔을 통해 확인할 수 있게 하는 코드입니다.
  • 444쪽 default: 10 뒤에 콤마 붙이기

4쇄에서 수정된 사항

  • bcrypt@3.0.7 사용하기
  • 시퀄라이즈 모든 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$를 주긴 합니다)
조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.

댓글

43개의 댓글이 있습니다.
5달 전
12.7장에 views/chat.html에 e.target.file = null; 로 하면 파일없음으로 변하지 않고 e.target.value =null; 이나 this.value = null로 해야 잘 실행됩니다
8달 전
차근차근 학습중에 있어요. 감사합니다.

4쇄 p.123 ch3.6. 콘솔 결과나오려면 코드 오타 정정 필요합니다.
fsDelete.js > 8 line
as is : newFile.js
to be : newfile.js
일 년 전
개정판 581페이지 module.exports = class Good이 아니라 class Auction 같습니다
일 년 전
감사합니다. 다행히 실행에는 문제 없는 오타네요. ㅠㅠ
일 년 전
개정판 p429 카카오에서 이메일 얻어오는 부분 profile_json.kaccount_email이 아니라 profile._json.kakao_account.email인거 같아요
일 년 전
감사합니다~ 카카오가 바꿨나보네요. 확인해보겠습니다.
일 년 전
개정판 p411 테이블옵션 timestamps, paranoid가 false로 적혀있네요
일 년 전
앗 감사합니다 ㅠㅠ
일 년 전
안녕하세요 개정 2판 책을 보고 있습니다. p31쪽의 '이벤트 루프는 호출 스택이 비어 있을 때만 태스크 큐에 있는 run함수..' 이 부분에서 태스크가 아니라 테스트 인것 같아요!
일 년 전
태스크(Task) 맞습니다~
일 년 전
개정판 290페이지에서

' 윈도의 경우 MYSQL과 함께 워크벤치를 설치했으므로 7.3.4절로 넘어가도 좋습니다. '
-> 7.4절 로 수정되어야 할 것 같습니다.
일 년 전
7.3.4절이 맞습니다~
일 년 전
초판을 보고 있습니다. 222쪽 상단 HTML 이스케이프 예시에서 EJS의 두 번째 문장 \u003cp>\u003c%- '\u003cstrong>이스케이프\u003c/strong>'%>\u003c/p>가 \u003cp>\u003c%- '\u003cstrong>이스케이프하지 않음\u003c/strong>'%>\u003c/p>으로 수정되어야 할 것 같습니다.
일 년 전
3.5.5.2 양방향 암호화(106 pg) crypto.createCipher, createDecipher deprecated 되었습니다. 선생님 github에서 cipher.js 수정 해주실 수 있을까요? 스스로 해보려 하는데 조금 어렵군요.
일 년 전
깃허브에 개정판 코드 올라가 있습니다~
2년 전
안녕화세요 2쇄 책 보고있습니다.
382쪽 이미지 업로드 모듈 limits 속성에 fileSize는 5 * 1024 * 1024로 되어있는데
383쪽 설명에 10MB 로 설명되어 있어 질문드립니다.
제가 알기론 저계산 식이라면 5MB가 되어야 할것같은데.. 제가 잘못 알고 있는건지,, 아니면 다른 부분에 대한 설명인건지 문의드립니다~
2년 전
5MB가 맞습니다 ㅠㅠ 감사합니다.
2년 전
kakao로그인 구현으로 별명을 한글로 불러오거나, 회원가입시 nick을 한글로 할 경우 에러가나네요..
찾아보니 sequelize cli의 db:create 실행 시 기본인코딩 디폴트 값이 cp1252 West European (latin1)이라서 그렇다는데
sequelize db:create --charset=utf8mb4 --env=development 명령어 수행 후 정상작동합니다.
2년 전
이 부분은 개정판에서 수정됩니다. 감사합니다.
2년 전
328쪽 schema/index.js의 코드를 설명하는 부분에서 1. 개발환경이 아닐 때 > 1. 개발환경일 때 /또는/ 배포환경이 아닐 때로 고치는게 맞을 듯 싶습니다!
2년 전
5쇄에서 수정됩니다. 감사합니다!
2년 전
"bcrypt@3.0.6 사용하기"가 구체적으로 어디가 어떻게 수정되었다는 뜻인가요?
"200쪽 cookie-parser 설명 명확하게 수정"의 수정된 내용을 어디서 확인할 수 있나요?
2년 전
형님... kakao 로그인 기능 만들때 Redirect path를 카카오에서 더이상 지원하지 않는데.. 그냥 무시하고 진행해도 될까요??
2년 전
밑에 질문 이어서 드리면 책에는 sequelize.define(...)이렇게 모델링하는데 이럴경우 belongsTo나 subclass 에러가 뜹니다. 하지만 return sequelize.define(...)이렇게 할경우 문제없이 되고여. 교재나 github코드로는 에러가 뜨는데 제가 잘못 이해한건가요?
2년 전
책의 코드에도 return이 되어있습니다. => ( sequelize.define ) 이 문법은 return이 생략된 문법입니다. 혹시나 {}를 하신게 아닌가요? github 코드로 에러가 나는지 확인해보았는데 나지 않습니다. 아마 코드 상에 오타가 들어있거나 그럴 확률이 큽니다.
2년 전
교재에서 models폴더에 있는 파일들 보면 sequelize.define할때 return을 안하던데 이러니 에러가 납니다. 그런데 return sequelize.define하면 문제가 없고여. 어떤 문제인가요?
2년 전
제 책에는 다 return이 되어있습니다. return이 생략된 문법일 뿐이에요.
2년 전
redis부분도 설정이 바뀌었습니다.
기존의 방식으로는 redis접근이 안됩니다
https://github.com/tj/connect-redis/blob/HEAD/migration-to-v4.md

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

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

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

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

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

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

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

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

굉장히 치명적인 것 같은데 다른분들은 질문을 안올리신 듯하여 올려봅니다.
3년 전
디비 테이블을 완전히 삭제하셔야합니다. destory는 디비 테이블 내용물을 지우는거고요. 명령 프롬프트에서 SQL문으로 지우시거나, 워크벤치를 통해서 지우셔야합니다. 251쪽 DROP TABLE 명령으로 지우시면 됩니다. 그 후에 서버를 재시작하세요.
3년 전
363쪽 주석(?) 2번 에서 N:M 관계 6.6.3 절에서 다뤘다고 해서 다시 보려고 갔는데 7.6.3 이네요
3년 전
아아 감사합니다 ㅠㅠ
3년 전
10장 400쪽의 routes/index.js 에서 User.findOne({ where: {id: req.user && req.user.id} })가 동작 가능한지 물어보고 싶습니다. WHERE parameter "id" has invalid "undefined" value 라는 오류가 뜨면서 안되더라구요
3년 전
req.user.id가 undefined인 것 같습니다. 이걸 하려면 먼저 if (req.user) 이런 걸로 감싸서 현재 로그인되어있는지부터 확인해야할 것 같습니다.
3년 전
감사합니다 해결됬어요!
3년 전
9.5 프로젝트 마무리하기 routes/post.js 코드 마지막쪽에 module.exports = router; 가 두번 쓰여있네요!
3년 전
안녕하세요! 열심히 공부하고 있습니다. 좋은 책 써주셔서 너무 감사드립니다.
다름이 아니라 궁금한 게 있어서요. 제가 ebook을 사용하는데 페이지 넘버가 표시가 안되서요 단서로 말씀드릴게요
7장에서 routes/comments.js를 작성한 후에 밑에 보라색 설명부분 1번에
"include 옵션에서 models 속성에는" 이라고 되어있는데 코드는 model이라고만 되어있더라고요. 그래서 models라고 코드에 적어야 하나 인터넷에 검색해보니까 코드에 model이라고 쓰는건 맞는 것 같네요.
그래서 밑에 설명부분의 models라는 게 오타인지 궁금해서요! 감사합니다!
3년 전
아.. 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(); 해보세요~