게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
etc - 6년 전 등록 / 2년 전 수정

Node.js 교과서 질의응답용 포스트

FAQ

  • 스스로 해보기 풀이는 없나요? - 제공하지 않습니다. 직접 어떻게든 해내보세요. 그래야 실력이 늡니다. 댓글로 문의하시면 힌트는 드립니다.
  • 오타&오류 정오표는 어디에 있나요? - 이 링크를 클릭하세요. 
  • 이미지 말고 다른 파일을 업로드하려면 어떡하나요? - multer로 다른 파일 형식도 업로드 가능합니다(동영상, 문서 등등).
  • 시퀄라이즈 5버전에서 WHERE parameter "id" has invalid "undefined" value 문제는 https://github.com/ZeroCho/nodejs-book/issues/42 참고하세요
  • TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Set-Cookie"] 에러 발생하시는 분은 Expires 앞에 줄바꿈을 제거해주세요. 줄바꿈 문자가 들어가면 안 됩니다.
  • 개정 2판에서는 socket.io@2 버전을 설치하셔야 req.session이 없는 문제 등이 발생하지 않습니다. socket.io@4 코드는 깃헙에 socket.io@4 브랜치에 있습니다. 개정3판은 socket.io@4로 진행해서 문제가 없습니다.
  • mysql 8 버전 설치 시 legacy authentication을 체크하셔야 비밀번호 관련 에러가 발생하지 않습니다. 추가로 이것도 보세요. https://github.com/ZeroCho/nodejs-book/issues/45 

다른 질문은 댓글로 입력해주세요. 또는 깃헙 이슈나 길벗 공식 홈페이지에 문의를 남겨주시면 됩니다.

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

125개의 댓글이 있습니다.
2년 전
스스로해보기 부분 깃허브에 업로드 가능하신가요 유튜브영상이랑 옛날 영상이라 다른부분 있어서 여쭤봅니다
2년 전
개정2판부터는 따로 제공하지 않는 것으로 변경되었습니다.
2년 전
안녕하세요 제로초님! 강의랑 'nodejs 교과서' 책 잘보고 있습니다.
다름이 아니라 책에서 9장 nodebird 프로젝트에서 passport으로 로그인 세션에 대해서 질문이 있습니다.

아래 코드 밑부분에서 (req,res,next);가 있는 이유를 책읽어도 전혀이해를 못하겠습니다.
사용자 정의 기능이 어떤것을 말하는지 모르겠고, 쉼표가 없는데 인수인지도 모르겠고, 이게 없으면 로그인이 왜 무한로딩하는지도 모르겠습니다.

[routes/auth.js]

// post login 로그인
router.post('/login' , isNotLoggedIn , (req, res, next)=>{
const {email, password} = req.body
// 인증 함수
passport.authenticate('local', (authError , user, info)=>{
if(authError){
console.error(authError);
return next(authError)
}
if(!user){
return res.redirect(`/?loginError=${info.message}`)
}
return req.logIn(user, (loginError)=>{
if (loginError){
console.error(loginError);
return next(loginError)
}
return res.redirect('/')
})
})(req,res,next); // 이부분을 모르겠습니다.
})
2년 전
6장 익스프레스 설명에서 커스텀 미들웨어 만들기가 있습니다. 그 부분이고요. passport.authenticate가 고차함수 미들웨어인데 그에 대한 인수입니다. 미들웨어를 커스텀하는 방식입니다.
(req, res, next) => {
미들웨어(req, res, next)
}
2년 전
미들웨어 내에서 req, res, next 값을 쓰고 싶을 때 주로 이렇게 변형합니다.
passport.authenticate('kakao') 미들웨어랑 비교해보시면 좋습니다.
2년 전
안녕하세요 제로초님! 강의랑 'nodejs 교과서' 책 잘보고 있습니다.
mysql과 연동하는 7장부분에 질문이 있습니다.

정답에 보면 아래와 같이 comment에서 해당 유저를 찾아서 댓글을 조회합니다.
router.get('/:id/comments', async (req, res, next) => {
try {
const comments = await Comment.findAll({
include: {
model: User,
where: { id: req.params.id },
},
});

그러나 Comment의 commenter는 User의 id와 결국 같은 값 아니예요?
그래서 아래와 같이 작성했는데 아래와 같이 작성하면 안되는 이유를 모르겠습니다.
router.get('/:id/comments', async (req,res,next) =>{
try {
const comments = await Comment.findAll({
where : { commenter : req.params.id }
})
2년 전
아래처럼 하셔도 됩니다. 안 되나요?
2년 전
아, 다만 User 정보(comment.User)들이 없겠네요.
2년 전
이해됐어요! 감사합니다!
2년 전
안녕하세요, 제로초님 열공중인 바로 밑에 질문 드렸었던 지망생입니다.
빠른답변 정말 감사했습니다!
다름아니라, 15장 공부중에 AWS lightsail, GCP 이용해서 책 따라 배포중에,
배포는 되었으나, css랑 axios 스크립트 등이 제대로 적용안되는걸 f12의 네트워크 보고 확인했습니다.
찾아보니 CSP 로 인해 차단되었더라구요.
보니깐 helmet이라는 npm 패키지가 그 역할을 하고 있는걸 구글링 통해서 알게되었습니다.

오랫동안 이런저런것 해보다가..밑에 처럼 작성하니, 정상적으로 CSS 적용되고 스크립트 적용되었습니다.

const {expressCspHeader, INLINE, NONE, SELF } = require('express-csp-header');

app.use(expressCspHeader({
directives: {
'script-src' : [SELF, INLINE, "https://unpkg.com"],
}
}));

책에는 require('helmet'), app.use(helmet()) \u003c\u003c 이렇게 2파트 나와있습니다.
처음 AWS,GCP 이용해서 배포하는 저같은 초보자들 ㅠㅠ.. 배려해서
helmet 설명부분에 NOTE 이런 식으루 작게나마 이런 내용두 추가되었으면 좋겠습니다!
해결한다구 이것저것 오래 걸렷어용 ㅠㅠ
2년 전
안녕하세요, ZeroCho님. 열공 중인 개발자 지망생 1인입니다.
9장3절 카카오로그인 파트에서, 카카오 함께 로그아웃하는 것 말입니다.
Note = 카카오 로그아웃 섹션에서 참조하라는 공식사이트보고 참고해서

routes/auth.js

router.get('/logout', isLoggedIn, (req,res)=>{
//req.logout();
//req.session.destroy();
//res.redirect('/');

//카카오도 같이 로그아웃할껀지 결정
const url = 'http://localhost:8001/';
req.logout();
req.session.destroy();
res.redirect(`https://kauth.kakao.com/oauth/logout?client_id=${process.env.KAKAO_ID}&logout_redirect_uri=${url}`);
});

첫 질문입니다 ㅠㅠ.
이렇게 그냥...한줄 공식문서에서..가져다 복붙해서 넣고,(젤 끝 redirect)
디팰롭퍼 내 어플에서 Logout Redirect URI도 const url의 밸류값이랑 똑같이 설정하니깐..제가 의도한 바 처럼 되긴 하는데.. 이거 정상인가요..?

구글 이런데 검색어로 (카카오도 같이 로그아웃) 검색하면 토큰? 책에서 안나온 내용들이 있더라구요. 제가 아직 9.3절까지 공부해서 그런가봐요.

그리고 마지막 질문으로
https://kauth.kakao.com/oauth/logout 여기 요청에 따른 카카오 측에서 구현된 방식이 >>
카카오 전략에서 받은 정보들 중 profile 정보 외에 (accessToken, refreshToken) 이거 이용해서 구현되있는건지.. 궁금합니다..
2년 전
네 그렇게 넣으시면 됩니다. 해당 주소로 GET 요청을 보내는 순간 카카오 로그인이 풀리는 겁니다. 토큰을 쓰는 것은 아니고 카카오 로그인용 쿠키를 지우는 것일 겁니다.
2년 전
const mongoose = require('mongoose');

const { MONGO_ID, MONGO_PASSWORD, NODE_ENV } = process.env;
const MONGO_URL = `mongodb://${MONGO_ID}:${MONGO_PASSWORD}@localhost:27017/admin`;

const connect = () => {
if(NODE_ENV !== 'production') {
mongoose.set('debug', true);
}
mongoose.connect(MONGO_URL, {
dbName: 'gifchat',
userNewUrlParser: true
}, (error) => {
if(error) {
console.log('몽고디비 연결 에러', error);
} else {
console.log('몽고디비 연결 성공');
}
});
};

mongoose.connection.on('error', (error) => {
console.error('몽고디비 연결 에러', error);
});

mongoose.connection.on('disconnected', () => {
console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.');
connect();
});

module.exports = connect;

12.5장을 진행했을때 계속 에러가 납니다.
몽고디비 연결이 끊겼다며 연결을 재시도 하라고 나옵니다.
issue에 등록한것처럼 createIndex도 제거하였고,
27017 포트에 몽고디비를 올리고 확인했을때, 계정 또한 생성되어있습니다.

그래도 npm start를 하게 되면 계속 무한로딩이 걸립니다.
왜그러는걸까요?
2년 전
다른데서 답변 드렸지만 궁금하신 다른 분들을 위해 답변 남기자면 useNewUrlParser 오타였습니다. 오타 조심하세요~
2년 전
9.2 데이터베이스 세팅하기 user.js에서 오류가 납니다.

TypeError: this.sequelize.isDefined is not a function
at Function.init (C:\workspace\vscode_workspace\nodebird\node_modules\sequelize\lib\model.js:699:24)
at Function.init (C:\workspace\vscode_workspace\nodebird\models\user.js:5:22)
at Object. (C:\workspace\vscode_workspace\nodebird\models\index.js:18:6)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Module.require (internal/modules/cjs/loader.js:952:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object. (C:\workspace\vscode_workspace\nodebird\app.js:10:23)

데이터베이스 세팅하기에 코드를 따라하고 npm start를 하면 계속 위와 같은 오류가 뜨네요.
아래는 소스 전문입니다. 왜 나는지 모르겠어서 질문드립니다.

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.init({
email: {
type: Sequelize.STRING(40),
allowNull: true,
unique: true
},
nick: {
type: Sequelize.STRING(15),
allowNull: false
},
password: {
type: Sequelize.STRING(100),
allowNull: true
},
provider: {
type: Sequelize.STRING(10),
allowNull: false,
defaultValue: 'local'
},
snsId: {
type: Sequelize.STRING(30),
allowNull: true
}
}, {
sequelize,
timestamps: true,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: true,
charset: 'utf8',
collate: 'utf8_general_ci'
});
}

static associate(db) {
db.User.hasMany(db.Post);
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow'
});
db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followings',
through: 'Follow'
});
}
};
2년 전
models/index.js에서 init 함수 실행할 때 이상한 걸 넣으신 걋 같습니다.
2년 전
한 번 확인해보겠습니다. 답변 감사합니다.
2년 전
챕터 13.2에서 auction.html에 입찰에 관련된 질문입니다.

\u003cform id="bid-form">
\u003cinput type="number" name="bid" placeholder="입찰가" required min="{{good.price}}">
\u003cinput type="msg" name="msg" placeholder="메시지(선택사항)" maxlength="100">
\u003cbutton class="btn" type="submit">입찰\u003c/button>
\u003c/form>

form 태그에 action을 통해 post 형식으로 바로 라우터로 보내는 것이 아니라
Event를 등록하셔서 axios를 사용한 이유가 있는지 궁금합니다!
2년 전
페이지를 새로고침하기 싫어서 그렇습니다.
2년 전
챕터 2에 나오는 https://www.zerocho.com/api/post, search 등의 주소가 동작하지 않습니다. axios.post 예제입니다.
3년 전
nodejs 교과서 쿠키와 세션 이해하기에서요
const http = require('http');
const parseCookies = (cookie='') =>
cookie
.split(';')
.map(v => v.split('='))
.map(([k, ...vs]) => [k, vs.join('=')])
.reduce((acc, [k, v]) => {
acc[k.trim()] = decodeURIComponent(v);
return acc;
}, {});

.map(([k, ...vs]) => [k, vs.join('=')])를 왜 넣었는지 궁금합니다.
그리고 .map(([k, ...vs]) => [k, vs.join('=')])의 기능이 뭔가요?
.map(([k, ...vs]) => [k, vs.join('=')]) 문법을 이해하지 못하겠어요..
특히 ... 연산자 .ㅠ.ㅠ
3년 전
9장 db 생성할때 오류나는데 질문드립니다
λ npx sequelize db:create

Sequelize CLI [Node: 14.17.6, CLI: 6.3.0, ORM: 6.11.0]

Loaded configuration file "config\config.json".
Using environment "development".
internal/crypto/hash.js:84
throw new ERR_INVALID_ARG_TYPE(
^

TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Array
at Hash.update (internal/crypto/hash.js:84:11)
at sha1 (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\auth_41.js:31:8)
at Object.token [as calculateToken] (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\auth_41.js:67:18)
at new HandshakeResponse (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\packets\handshake_response.js:28:26)
at ClientHandshake.sendCredentials (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\commands\client_handshake.js:57:31)
at ClientHandshake.handshakeInit (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\commands\client_handshake.js:142:12)
at ClientHandshake.execute (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\commands\command.js:45:22)
at Connection.handlePacket (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\connection.js:456:32)
at PacketParser.onPacket (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\connection.js:85:12)
at PacketParser.executeStart (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\packet_parser.js:75:16)
at Socket.\u003canonymous> (C:\Users\woo28\Desktop\cmder\cmder\nodebird2\node_modules\mysql2\lib\connection.js:92:25)
at Socket.emit (events.js:400:28)
at addChunk (internal/streams/readable.js:290:12)
at readableAddChunk (internal/streams/readable.js:265:9)
at Socket.Readable.push (internal/streams/readable.js:204:10)
at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
code: 'ERR_INVALID_ARG_TYPE'
}
3년 전
config/config.json에서 비밀번호쪽이 문제인 것 같습니다.
3년 전
아 바로되네요 감사합니다!!
3년 전
9장 파일 업로드 부분에서, html 폼에서 /post 라우터로 이미지를 보내는데, /post/img 라우터에서 어떻게 이미지를 업로드 받은 후 "/img"경로를 어떤 경로로 /post 라우터에 보내는지 이해가 안갑니다. 설명 부탁드릴게요.
3년 전
/post/img 라우터에서 응답으로 보내는 데이터가 input에 들어갑니다(프론트 코드 보시면 그 부분이 있습니다) 그리고 그 인풋이 submit 시 다시 /post 라우터로 보내집니다.
3년 전
노드를 사용하여 채팅서비스 프로젝트를 구현 하려고 합니다. 웹소켓을 사용하는 방법의 장단점을 알고 싶습니다. 실무에서 채팅을 만들때 웹소켓을 많이 사용하는 편인가요?
3년 전
웹소켓이 아닌 방식을 상상하기 어렵습니다.
3년 전
안녕하세요 Nodejs 교과서 스스로 해보기 중 도저히 무슨 에러인지 못찾겠어서 질문 드립니다.
10장의 클라이언트를 위해 API 문서 작성하기를 swagger로 진행했습니다.
swagger로 post요청 시엔 문제가 없으니 get 방식에서만 cors 에러가 발생합니다.
swagger 에러 내용:
Failed to fetch.
Possible Reasons:

CORS
Network Failure
URL scheme must be "http" or "https" for CORS request.

포스트맨이나 웹 브라우저를 이용해서 요청을 보내면 문제가 없지만 swagger를 사용 시에만 문제가 발생합니다.
콘솔 에러 내용은 TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received undefined 입니다.
코드는 책의 코드를 사용해서 문제가 없다고 생각하는데 swagger로 get요청을 할 때만 해당 에러가 발생합니다.해당 에러를 고칠 방법이 있을까요?
3년 전
네트워크 탭을 열어서 실제 요청이 어떻게 갔나 봐야합니다. 에러가 났으므로 빨간 요청이 있을 겁니다. 주소나 헤더를 잘 봐보세요.
3년 전
헤더를 확인해보니 get 요청을 보낼 땐 origin 값이 들어있지 않고 post 요청을 보내면 origin 값이 들어있습니다

/**
* @swagger
* /v2/posts/my:
* get:
* tags:
* - posts
* description: 나의 게시물 확인
* priduces:
* - application/json
*
* responses:
* 200:
* description: posts.
* 500:
* description: 서버 에러
*/
현재 이렇게 작성된 상태입니다.
코드는 건드린게 없는데 swagger 문법에 문제가 있는건가요..?
위 코드에서 요청 방식만 get에서 post로 바꾸면 정상적인 응답이 옵니다
3년 전
priduces 오타 내신것 같습니다.
3년 전
아 죄송합니다. 여러가지 시도해 보다가 수정을 하면서 오타가 생긴 것 같은데 오타 문제가 아닙니다. 다른 요청들은 다 되는데 get 요청만 되지 않습니다. get 요청에만 헤더에 origin이 없습니다
3년 전
안녕하세요 저자님! 책 잘읽고있습니다. 다름이 아니라 '12장 웹 소켓으로 실시간 데이터 전송하기' p575 핵심정리 부분에

'소켓 통신과 함께 데이터베이스 조작이 필요한 경우, 소켓만으로 해결하기보다는 HTTP 라우터를 거치는 것이 좋습니다.'

라고 하시고 앞부분에서도 이 근거로 코드 관리에 대한 용이성이라는 장점을 말씀해주셨습니다. 여기서 질문이 드는것은 이렇게 웹소켓으로만 실시간 채팅을 해결하지 않고 라우터를 거침으로써 코드 관리에 대한 용이성 이외의 장점은 따로 없을까요? 이렇게 되면 양방향보다는 단방향 애플리케이션이 되는 것 같은 생각이 들어서요.

감사합니다.
3년 전
실무에서 저는 웹소켓으로 백엔드 서버에 요청을 보내면 DB 관련 작업을 이벤트로 만들어 AWS SNS같은 곳에 pub합니다. 그리고 다른 라우터에서 해당 이벤트를 sub하여 DB 작업을 합니다. http 라우터를 꼭 거칠 필요는 없으나 웹소켓 이벤트리스너에서 바로 DB 조작을 하는 건 부정적입니다.
3년 전
안녕하세요 Nodejs 교과서를 보고 이해가 잘 가지 않는 부분이 있어 질문 드립니다.
10장에 JWT 토큰을 사용하는 것에 대한 질문입니다.
기존 passport로 로그인 전략을 구현을 했는데 이를 JWT토큰을 사용하여 로그인 하는 방법이 많이 사용된다고 하셨고 로컬 로그인 전략의 authenticate 두 번쨰 옵션으로 {session:false} 를 주었고 verifyToken을 이용하여 인증을 하면 된다고 했습니다.
그래서 세션에 데이터를 저장하지 않으므로 serializeUser와 deserializeUser를 사용하지 않는다고 하여 해당 부분을 주석처리하고 실행하니 에러가 발생했습니다. serializeUser와 deserializeUser를 그대로 두고 verifyToken을 사용하니 deserializeUser도 매 요청마다 실행되고 verifyToken도 실행이 됐습니다.
세션을 사용하지 않고 JWT토큰을 사용하여 로그인을 하려면 이 passport로 구현한 로그인 전략들을 JWT토큰을 사용하게 모두 수정해야 하는 것인가요?
3년 전
10장의 jwt 방식은 passport와 아무런 관련이 없습니다. passport를 안 쓰실거면 아예 안 쓰시면 되고요. 쓰실거면 serializeUser와 deserializeUser는 지우지 마세요.
3년 전
그렇다면 session을 이용하여 로그인 전략을 구현할 땐 passport를 사용하고
jwt토큰을 이용하여 로그인 전략을 구현하려면 교과서와 다르게 코드를 새로 짜면 되는 것으로 이해하면 될까요?
3년 전
passport-jwt가 있긴 합니다. 이 패키지 찾아보세요~
3년 전
안녕하세요 4장 4.2 의 웹서버 실습시 restFront의 코드에서 window.onload no define err가 뜨는데
이는 javascript 파일이 모두 읽이전에 html함수 때문이라고 하는데 이때는 코드위치를 어떻게 바꿔야하나요?
3년 전
script 태그가 다른 html보다 아래에 있으면 됩니다.
3년 전
안녕하세요 교과서를 보면서 공부하고 실습한 것을 토대로 개인적으로 공부하고 실습중에 에러가 발생하여 질문드립니다.
Cannot convert undefined or null to object
at hasOwnProperty (\u003canonymous>)
at Function._paranoidClause (/Users/seungh/Desktop/appCenter/midterm/node_modules/sequelize/lib/model.js:202:65)
at Function.findAll (/Users/seungh/Desktop/appCenter/midterm/node_modules/sequelize/lib/model.js:1747:20)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async Function.findOne (/Users/seungh/Desktop/appCenter/midterm/node_modules/sequelize/lib/model.js:1917:12)
at async /Users/seungh/Desktop/appCenter/midterm/routes/members.js:81:24

이러한 에러가 발생했는데 찾아봐도 어떤 에러인지를 모르겠습니다..
이전엔 잘 쓰던 쿼리문이 findOne과 findAll에서 안되니 왜 그런지 이유를 모르겠습니다
현재 데이터베이스 연결 까지는 성공했고 create까지도 됐지만 조회가 안됩니다
혹시 어떤 이유인지 알 수 있을까요?
3년 전
findOne에 들어간 값 중에 undefined가 있는 것 같습니다. undefined가 들어가지 않게 하세요.
3년 전
const{email,password,age,name} = req.body;
try{
const checking = await Member.findOne({
where:{
email
},
});
코드가 이런데 그렇다면 Member라는 테이블을 생성할 때 잘못된 것인가요..?
email값은 잘 받아와 집니다
3년 전
console.log(email) 해보신건가요? 그리고 findOne이 81번째 줄 맞나요?
3년 전
넵 콘솔에 출력해서 출력되는 것 까지 확인했고 findOne이 81번째 줄에 있습니다
다른 줄에 있는 find관련된 것들도 동일한 에러가 발생합니다
제가 계속 수정해가며 테스트 하는 것이 81번째 줄이고 findOne을 거기서 사용했습니다
3년 전
해결한 것 같습니다!감사합니다!
3년 전
안녕하세요. Nodejs 교과서 7장 실습하면서 궁금한 점 질문드립니다.

sequelize.html에서 axios.post로 이름, 나이, 결혼여부에 대한 정보를 post 방식으로 요청하였을 경우 await User.create하여 DB생성까지는 잘 해냈습니다.

이후 res.status(201).json(user) 대신

post 구문에서 바로 전체 user정보를 조회하여 sequelize.html로 render나 redirect를 사용하여 테이블을 갱신하고자 다음과 같은 방법을 사용해봤습니다.

---- routes/user.js ----
const user = await User.create(req.body);
const users = await User.findAll();
res.render('sequelize.html', {users});


---- public/sequelize.js ----
// 사용자 등록 시
await axios.post('/users', {name, age, married});
// getUser(); \u003c---- 주석처리

의도는 res.render('sequelize.html', {users}); 를 호출함으로써 users에 대한 정보 전부를 sequelize.html로 전달하고 sequelize.html 내부 테이블 구성에서 users만큼 반복문을 돌면서 테이블을 갱신하고자 하는 목적이었으나 DB생성까지는 확인이되었으나 테이블 갱신이 되지 않는 상황입니다.
(현재 F5, 새로고침 누를 시 갱신된 테이블을 확인할 수는 있습니다.)

새로고침을 하지 않고 바로 테이블을 갱신하고자 할 경우 교과서 방법외에 다른 방법이 있나 해서 질문드립니다.
3년 전
ajax 요청의 경우 res.render같은 게 먹지 않습니다. form 태그로 만들어서 form 요청을 하시거나, ajax 요청 완료 후 location.reload()로 수동 새로고침을 하세요.
3년 전
빠른답변 감사드립니다~!!! 교과서에서는 ajax가 아닌 axios를 사용하여 post 요청을 전달하였는데 axios또한 render기능이 제대로 작동하지 않는건가요?
3년 전
axios가 ajax 구현체입니다.
3년 전
안녕하세요. Nodejs 교과서보면서 공부중에 질문드립니다.
4-3 장에 cookie2.js 파일 안에
const { query } = url.parse(req.url) 구문에서
const { query } 가 어떤식으로 선언되어 할당되는지 궁금하여 질문 드립니다.

const query = url.parse(req.url).query; 이런 식으로 진행해도 차이는 없는 것으로 확인했는데 어떤 방식에 의해 선언되며 할당되는지 혹은 인터넷에 뭐라고 검색하면 관련 레퍼런스 참고할수 있을지 궁금합니다...
3년 전
제 책 2장에 구조분해 할당 있습니다
3년 전
안녕하세요 nodejs 교과서 보면서 공부중인 학생입니다.
시퀄라이즈를 사용하는데 쿼리문과는 읽는 방식이 조금 다른 것 같아 질문드립니다.
select distinct(Table_num),Table_cnt from orders,stores where orders.store_code = stores.store_code and stores.Nick = 'Jhon';
해당 쿼리문을 시퀄라이즈로 어떻게 변형해야 하나요?
시퀄라이즈를 사용하니 필요없는 컬럼명까지 select가 되어서 자꾸 에러가 발생하여 질문 드립니다.
3년 전
attributes: [
Sequelize.fn('DISTINCT', Sequelize.col('Table_num')), 'Table_cnt'
],
이런 옵션이 있습니다.
3년 전
선생님 언제나 댓글 감사합니다. mysql를 위해 sequelize를 쓸때 migrations 폴더도 생기는데 이 폴더는 언제 쓰는 것이고 정체가 무엇인가요?
3년 전
db 컬럼 변경이나 테이블 변경 사항을 코드로 처리할 때 작성하는 코드를 모아두는 폴더입니다.
3년 전
안녕하세요. passport를 쓰지 않고 JWT 토큰으로만 로그인 인증을 구현하면 간단할 것 같은데 혹시 그러지 않는 이유가 있나요?
3년 전
토큰 인증이 쿠키에 비해 훨씬 더 복잡합니다.
3년 전
node.js 교과서 개정2판 457p 중간에 위치한 '다음은 도메인을 등록하는 화면입니다 ......' 문단의 위치가 흐름에 맞지 않습니다. 큰 결함은 아니지만 개정 3판이 나올수도 있으니까... 글 올려봅니다.
3년 전
안녕하세요. node 교과서 보며 잘 공부하고 있습니다.
한가지 궁금한 점이 책 9장에 있는 passport 관련 소스코드를 참고해서 배포용 프로그램에 적용시킬 예정인데, 라우팅 방법이나 암호화 방법 등 교재 내용 대부분을 실제로 사용해도 무방할까요?
3년 전
네 그대로 쓰셔도 됩니다. https만 추가로 적용하시면 됩니다.
3년 전
그러면 app.js 에 app.use -> session -> cookie 에서 {httpOnly: true, secure: true,} 이런식으로 설정하면 될까요?? 감사합니다
3년 전
교재 9.3절 카카오 로그인 구현중입니다...
'카카오톡' 버튼을 클릭하면
Field 'password' doesn't have a default value
이런 오류가 떠서 깃허브에 9.3절에 나오는 코드들을 그대로 옮겨서 해봤더니. 또 같은 오류가 발생하네요...
어떤 문제인지 감이 안잡혀요.... ㅠㅠ
카카오 developer 로그인 동의항목에서는 프로필정보, 카카오계정(이메일)를 동의했습니다.

그리고 회원가입하면
Support for `{where: 'raw query'}` has been removed. 이렇게 나오는데 왜 그러는 걸까요?
3년 전
models/user.js에서 password가 allowNull: true가 아닌가요? allowNull: false로 되어있다면 비밀번호가 필수값이 되어버립니다. allowNull: true로 바꾸고 테이블 지웠다 다시 만드세요.
3년 전
해결했습니다. DB를 통째로 삭제했다가 다시 만드니까 해결이 됐네요... 제 생각엔 PC 카톡에 로그인 되어있어서 이거나 developer.kakao 에 로그인 되어있는 상태라서 그랬던 것 같습니다.
3년 전
p.s. Support for `{where: 'raw query'}` has been removed. 에러는 철자 오류였습니다.
3년 전
안녕하세요,
시퀄라이즈에서 findOne 할 때 const exUser = await User.findOne({ where: { email } });
이부분에서 에러가 나는데 혹시 왜 그런지 아실까요??

error-> [0] TypeError: Cannot convert undefined or null to object

콘솔로 User를 찍으면 그냥 User라고 나오는데 제대로 못 가져온 걸까요?
3년 전
User가 undefined가 아니라면 email이 undefined같네요.
3년 전
안녕하세요. 12장 웹소켓으로 실시간 데이터 전송하기를 보고 채팅을 만들었는데 Chat.create를 6번 연속하면 서버가 멈추고 재시작하면 멈췄을때 입력했던 값이 무작위로 create 되는데 해결 방법을 알 수 있을까요??
3년 전
socket.io 3버전을 쓰셨나요?
3년 전
안녕하세요, 개정판 잘 보고 있습니다. 혹시 socket.io 라이브러리 3.0버전으로 깃허브 코드 수정예정은 없으신가요? gif 채팅방이랑 경매장 둘다 socket.io를 3버전으로 하게되면 안되는 부분이 있네요.
3년 전
다음판 나오기 전까지는 master브랜치는 2버전으로 할 수밖에 없습니다. 기존 2버전으로 쓰신 분들이 많으셔서요. 별도로 브랜치를 파서 코드를 올리긴 하겠습니다.
3년 전
안녕하세요. 9장에서 nodebird를 구현하면서 pug를 작성 할 때, 값의 전달에 대해 궁금한 점이 있습니다. layout.pug의 body부분을 보면 [ if user && user.id ] 이라는 구문이 있는데, 이때 user라는 값은 어디서 어떻게 가져오는건가요? script로 불러오는것도 아닌데, 페이지를 구성할 때 어떻게 user의 값이 가져와 지는지 궁금합니다. 제 생각으로는 세션에 접근해서 가져오는것으로 파악이 되는데, passport를 구현할 때, session으로 넘기는 값은 user.id만을 넘기는데, 그 이후에 user.Followings 등등으로 user에 담긴 모든값을 가져오는게 도저히 이해가 되질 않습니다. 따로 user.id를 이용해 값을 가져오는 function을 작성한것도 아닌데, 어떻게 user의 모든 값이 담겨져 있는건가요??
3년 전
res.render('템플릿이름', { user: 값 }) 하면 user가 pug로 전달됩니다. res.locals.user = 값 해도 전달되고요.