게시글

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

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

조회수:
0

FAQ

  • 스스로 해보기 풀이는 없나요? - 유튜브나 인프런 강좌에서 제공합니다(인프런에서도 무료로 보실 수 있습니다.)
  • https://open.kakao.com/me/zerocho 로 연락주시면 인프런 할인 쿠폰을 드립니다. 
  • 오타&오류 정오표는 어디에 있나요? - 이 링크를 클릭하세요. 
  • 이미지 말고 다른 파일을 업로드하려면 어떡하나요? - multer로 다른 파일 형식도 업로드 가능합니다(동영상, 문서 등등).
  • pug 스타일이 너무 싫어요 ㅠㅠ - ejs나 다른 걸로 바꾸시면 됩니다. pug는 제 책에서 중요한 부분이 아닙니다. 그저 지면을 아끼기 위해 선택했을 뿐이에요.
  • bcrypt가 윈도에서 안 깔려요. - bcrypt 문서에 윈도에서 bcrypt 설치하는 방법에 대해 나와 있습니다. 3버전부터는 그렇게 적용하셔야 합니다.
  • 시퀄라이즈 4버전을 사용하셔야 합니다. 5버전을 사용하면 find가 작동하지 않습니다. (이 부분은 추후에 5버전으로 일괄 업그레이드 하겠습니다)
  • 시퀄라이즈 5버전에서 WHERE parameter "id" has invalid "undefined" value 문제는 https://github.com/ZeroCho/nodejs-book/issues/42 참고하세요

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

투표로 게시글에 관해 피드백을 해주시면 많은 도움이 됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright © 2016- 무단 전재 및 재배포 금지

댓글

43개의 댓글이 있습니다.
5일 전
11.4 과정 질문입니다.
다른 부분은 다 의도한대로 동작하는데,
입장과 퇴장의 system 메시지가 user를 undefined로 표시합니다.
따라서 undefined님이 입장하셨습니다.와 같은 system 메시지가 표시됩니다.
req.session.color 값이 없어서 그런 것 같은데요.
app.js나 routes/index.js에서 console.log(req.sessionID)를 찍은 결과와
socket.js의 chat.on에서 console.log(req.sessionID)를 찍은 결과가 같지 않습니다.
소켓 연결 시 세션을 새로 만들어버려 기존에 입력한 session.color 값을 읽지 않는 것 같은데
제가 어디를 잘못 생각하고 있는 걸까요?

교재 깃헙에서 11.4 코드를 그대로 다운받고 .env를 수정하여 실행해도 같은 결과입니다.
5일 전
io.use sessionMiddleware 부분에서 sessionMiddleware가 재사용된 것이 맞죠? 새로 생성한 경우는 다른 세션이 생겨버릴 수 있습니다.
5일 전
네 app.js에서 webSocket에 인자로 넘겨주어 사용했습니다.

또한 교재 깃헙의 코드를 그대로 받아 사용해도 같은 결과가 발생합니다.
5일 전
희한하네요 제가 11.4를 방금 해봤는데 정상적으로 작동합니다. .env의 COOKIE_SECRET 값도 주신 것 맞죠? 프로젝트를 완전히 삭제 후 다시 해보세요. 만약 그래도 안 된다면 코드를 zerohch0@gmail.com으로 보내주세요.
4일 전
.env의 mongodb 비밀번호만 바꾸고 나머지는 교재 깃헙에서 다운받은 코드 그대로이기 때문에 보내드리는 건 의미가 없을 것 같습니다.

어쩌다보니 해결이 되었는데 pug 파일들의 localhost 부분을 공유기에서 할당해준 내부 ip인 192.168.0.x로 변경하고, 브라우저에서도 localhost:8005나 127.0.0.1:8005가 아닌 192.168.0.x:8005로 접속하니 정상적으로 동작합니다. 루프백으로 접속하는 것과 어떤 차이가 있는지 잘 모르겠습니다.
22일 전
최대한 간소화 한
다른 주소로 이동하는 리스너 버튼 사용법은 게시 해 주실 수 있나요?
PUG로 구현하려는데 문법을 몰라서 헤매고있습니다.. ㅠㅠ
PUG에서는 script 안에서 함수 구현을 못 하나요?
22일 전
script. 으로 script 뒤에 점을 붙이면 다음 줄부터 js를 사용할 수 있습니다. 다른 주소로 이동하는 것은 location.href = 주소; 로 가능합니다.
한 달 전
안녕하세요. 9장에서 로그인을 하려고하면 로그인이 안되는데 혹시 어디가 문제인지 봐주실 수 있을까요?
1. bcrypt대신 bcyrptjs 를 사용했습니다. <- bcrypt가 저의 컴퓨터에서는 안 깔리더군요
2. find() 대신 findOne() Function을 사용했습니다.
3. 소스 코드를 이용해서 작동했을 때는 잘 넘어갔습니다만, 제가 직접 코드를 쓰고싶었습니다.


/*****************auth.js************************/
const express = require('express');
const passport = require('passport');
const bcrypt = require("bcryptjs");
const { isLoggedIn, isNotLoggedIn } = require('./middlewares');
const { User } = require('../models');

const router = express.Router();
//auth/join
router.post('/join', isNotLoggedIn, async(req, res, next) => {
const { email, nick, password } = req.body;
try {
const exUser = await User.findOne({ where: { email } });
if(exUser) {
req.flash('joinError','This email is already registered');
return res.redirect('/join'); // Back to Register page
}
const hash = await bcrypt.hash(password, 12);
await User.create({
email,
nick,
password: hash
})
return res.redirect('/');
}
catch(error) {
console.error(error);
return next(error);
}
});
// auth/login
router.post('/login', isNotLoggedIn, (req, res, next) => {
passport.authenticate('local', (authError, user, info) => {
if (authError) {
console.error(authError);
return next(authError);
}
if (!user) {
req.flash('loginError', info.message);
return res.redirect('/');
}
return req.login(user, (loginError) => {
if (loginError) {
console.error(loginError);
return next(loginError);
}
return res.redirect('/');
});
})(req, res, next);
});

// auth/logout
router.get('/logout', isLoggedIn, (req, res) => {
req.logout();
req.session.destory(); //Session destory
res.redirect('/');
});

router.get('/kakao', passport.authenticate('kakao'));

router.get('/kakao/callback', passport.authenticate('kakao', {
failureRedirect: '/',
}), (req, res) => {
res.redirect('/');
});

module.exports = router;


/****************localStrategy.js************************/

const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require("bcryptjs");

const { User } = require('../models');

module.exports = (passport) => {
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
}, async (email, password, done) => {
try {
const exUser = await User.findOne({ where: { email } });
if (exUser) {
const result = await bcrypt.compare(password, exUser.password);
if (result) {
done(null, exUser);
} else {
done(null, false, { message: 'Id or password is wrong' });
}
} else {
done(null, false, { message: 'User is not registered' });
}
} catch (error) {
console.error(error);
done(error);
}
}));
};
한 달 전
소스 코드가 아니라 에러 메시지를 올려주셔야 합니다.
한 달 전
12장 auction.pug에서
block good
h2= good.name
div= '등록자: ' + good.owner.nick
div= '시작가: ' + good.price + '원'
strong#time(data-start=good.createdAt data-end=good.end)
img#good-img(src='/img/' + good.img)

script.
...
var es = new EventSource("/sse");
var time = document.querySelector('#time');
es.onmessage = function (e) {
var end = new Date(time.dataset.start);
var server = new Date(parseInt(e.data, 10));
end.setMinutes(end.getMinutes() + parseInt(time.dataset.end));
if (server >= end) {
return time.textContent = '00:00:00';
} else {
var t = end - server;
var seconds = ('0' + Math.floor((t / 1000) % 60)).slice(-2);
var minutes = ('0' + Math.floor((t / 1000 / 60) % 60)).slice(-2);
var hours = ('0' + Math.floor((t / (1000 * 60 * 60)) % 24)).slice(-2);
return time.textContent = hours + ':' + minutes + ':' + seconds;
}
};
위 코드 중에서 var end = new Date(time.dataset.start);에서 계속
Uncaught TypeError: Cannot read property 'dataset' of null at EventSource.es.onmessage
이 에러가 계속 뜨는데 어떻게 해야할까요 ㅠㅠ
한 달 전
var time = document.querySelector('#time');을 es.onmessage 안으로 넣어보세요.
2달 전
9장과 10장에서 module 정의할때 module.export = (,) => () 로 되어있더라구요

저는 9장에서 user는 (,)=>()로 하고 오류가 없었는데 10장에서 domain을 (,)=>{}로 하니까 db.user.hasmany(db.domain) 이 오류가 나서 한참 찾았습니다.
근데 둘다 (,)=>()로 하니까 오류가 안나네요
람다함수(화살표함수)를 (...params) => () 로 하는 경우도 있나요? 영역은 {}로만 지정하는줄 알았는데 확인좀 부탁드려요
2달 전
네 바로 리턴하는 함수입니다. => ()로 하면 그 내용물이 바로 리턴됩니다.
2달 전
sequelize를 mariadb와 연동하기 위해서는 어떻게 해야하나요?
sequelize db:create하면
ERROR: Dialect mariadb does not support db:create / db:drop commands
이런 오류가 발생합니다.

npm i mariadb 했는데도 안되네요
2달 전
mariadb는 sequelize db:create를 지원하지 않습니다. 워크벤치나 SQL문으로 데이터베이스를 생성하셔야겠네요.
2달 전
400p를 공부하고 있습니다.
user.find 에서 id를 찾는데 db에 id값이 없어서 그런지
WHERE parameter "id" has invalid "undefined" value
라고 계속 뜹니다.
현재 sequelize 5버전이고 findOne으로 수정해서 하고있습니다.
제가 오타가 있나 싶어서 전부다 복붙하고 find -> findOne으로 변경후 진행중인데 계속 이렇네요 ㅠㅠㅠㅠ
2달 전
이 부분은 https://github.com/ZeroCho/nodejs-book/issues/42 참고하세요. 시퀄라이즈 5버전에서 많은 게 바뀌었습니다 ㅠㅠ
2달 전
안녕하세요. 제로님.

질문이 더 있어 코멘트 남깁니다.

1. 200p ~ 201p

cookie-parser 내용입니다.

첫번째 인자로 문자열을 넣을 경우 서명 된 쿠키가 된다고 하였는데, 실제로 다음과 같이 체크 해보니.


console.log(req.signedCookies);


서명 된 쿠키는 connect.id 하나만 존재하였습니다.


실제로는 다른 쿠키들도 설정하여 사용하고 있습니다.


정확히 어떻게 작용하는 것인지 궁금합니다.


예로 서명 된 쿠키를 전달 해주기 위해서는 다음과 같이 해야 한다는데.


다음과 같이 설정 할 경우 서명 된 사인이 일치하여 정상적으로 작동하는것이 아닌가해서요.


단순히 인자값을 넣는 것으로 서명 된 쿠키로 작동하는게 아닌 것 같아서요 ^^;


res.cookie('name', 'sign value', {signed: true});
2달 전
서명된 쿠키가 오면 그 값들을 자동으로 파싱하는 겁니다. 인자로 주어진 키로 복호화해서요.
2달 전
제로님. 답변 감사합니다.

말씀하신대로 서명 된 쿠키가 오면 그 값들을 자동으로 파싱한다면,

다음의 코드에는 왜 connect.sid 하나만 들어있는 걸까요.

서명 된 다른 쿠키들도 보여야 하는게 정상아닐까요.

많이 헷갈리네요 궁금한것들도 많구요 ^^;

console.log(req.signedCookies);
2달 전
서명된 다른 쿠키가 어떤 것이 있나요?
2달 전
제로님. 이제 이해하였습니다.


cookie-parser 미들웨어의 역할은 전달된 쿠키들을 첫번째 인자의 문자열로 파싱하는 것이였군요.


만약 서명 된 쿠키들을 세팅 하려면 {signed: true} 로 설정하면 되는 군요.


그래서 클라이언트에서 조작을 방지 할 수 있다고 하셨군요.


그런데 책에는 '이제 쿠키들은 제공한 문자열로 서명된 쿠키가 됩니다.' 라고 되어 있어.


쿠키를 세팅하기만 하면 첫번째 인자의 문자열로 서명되는 것처럼 마치 설명 되어 있어서요.


이 부분은 헷갈릴 수 있는 것 같습니다. ^^;;
2달 전
감사합니다. 그 부분은 명확하게 수정하도록 하겠습니다.
2달 전
안녕하세요. 제로초님 챕터9 SNS 만들기 부분에서 (예제 파일 9.4) TypeError: User.find is not a function 오류가 발생합니다. 코드를 github에서 다운로드해서 해봤는데도 오류가 납니다. 코드 비교도 해봤고 에러 나는 부분 들어가서 봤습니다. User.find({ where: { email } }); 문제인 거 같은데.. 잘 모르겠습니다. MySQL에서 users로 테이블 만들어져있습니다.
2달 전
정요표에 적어둔대로 시퀄라이즈 4버전을 설치하거나 find를 findOne으로 수정하셔야 합니다. 현재 시퀄라이즈 5버전 설치하신 것 같네요.
2달 전
감사합니다!
2달 전
3.6 파일시스템 접근에서 console.log(data.toString()); 과 불러올때 utf8 을 붙이면 같은 결과가 나오는데 무슨 차이인가요?
2달 전
utf8같은 것은 버퍼를 어떤 인코딩으로 해석할지를 나타내는데요. 기본적으로 utf8이라서 붙이나 안 붙이나 같은 결과가 나오는 것 같습니다.
2달 전
흠..그럼 utf8 안붙이고 toString만 붙여도 되는거죠?
2달 전
아마도 그럴겁니다.
2달 전
안녕하세요 제로님!
이번엔 다름이 아니라 9.5.1에서 팔로잉 끊기를 실행해보려고하는데요.
Follow라는 테이블에 있는 값을 삭제해야하는데 어떻게 접근을 해야할지 감이안오네요.
User의 값을 삭제할때는 User.destroy({where: {id}}); 이런식으로 접근을 하면되는데
delete/:id/follow 이러한 api로 작성하려고하는데
await Follow.destroy({ where: { followerId: req.user.id, followingId: req.params.id}});
이러자니 Follow를 알지못해서 어떻게 진행하면될지 알려주시면 감사하겠습니다!!
2달 전
먼저 현재 사용자를
const user = await User.findOne({ where: { id: req.user.id } });
로 찾은 뒤
await user.removeFollowing(req.params.id); 이런 식으로 하시면 됩니다. 다대다 관계의 가운데 테이블은 직접 접근할 수가 없어서요.
2달 전
아아!! 책에는 destroy사용하라고 하셔서!! 계속 이걸로해보고있었는데!! 감사합니다1!!!!
3달 전
안녕하세요..
9장의 find() 를 findOne()으로 변경하고, 9.3장 까지는 잘 수행되었는데,
9.4 ~ 9.5 까지의 소스를 Key-in하로 실행 시키면 아래 오류가 나은데 원인이 무엇일까요?

<화면상에 나타난 오류>

user is associated to user multiple times. To identify the correct association, you must use the 'as' keyword to specify the alias of the association you want to include.

SequelizeEagerLoadingError: user is associated to user multiple times. To identify the correct association, you must use the 'as' keyword to specify the alias of the association you want to include.
at Function._getIncludedAssociation (C:\DevNode\cafe24_nodejs_mysql\pmsadmin02_0402\node_modules\sequelize\lib\model.js:728:13)
3달 전
key in하로 실행한다는 게 어떤 뜻인가요? as 키워드가 include할 때 빠지지 않았는지 살펴보세요.
3달 전
363P에서 User간의 self join을 할때
db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followers',
through: 'Follow'
});

db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followings',
through: 'Follow'
});

as를 아래처럼하는 것이 아닌 위에처럼 하는건지가 궁금해서 문의남겼습니다!

db.User.belongsToMany(db.User, {
foreignKey: 'followingId',
as: 'Followings',
through: 'Follow'
});

db.User.belongsToMany(db.User, {
foreignKey: 'followerId',
as: 'Followers',
through: 'Follow'
});
3달 전
foreignKey와 as는 반대 관계입니다. 팔로워는 팔로잉아이디를 받고, 팔로잉은 팔로워아이디를 받습니다.
2달 전
그렇다면 Follow라는 테이블에 col명은 어떻게 정해지는건가요?
2달 전
as에 적힌 문자열에 primaryKey를 붙여서 생성됩니다.
2달 전
아!!! 너무나도감사합니다1!!
3달 전
안녕하세요. 제로님. 책 잘보고 있습니다. 다름이 아니라 한 가지 궁금한점이 있어 질문 남깁니다.


1. 456p ~ 457p

- 해당 페이지의 1번 설명을 살펴보면 세션을 공유하기 위해 웹 소켓에서도 미들웨어를 사용하여 세션을 공유한다고 되어 있습니다.

그런데 궁금한점은 sessionMiddleware(socket.request, socket.request.res, next); 이렇게 세가지의 인자를 보내주고 있는데, 세션 미들웨어 변수를 살펴보면 해당 인자를 받는 부분이 없는데 어떻게 보내 줄 수 있는지 궁금합니다.

그리고 추가적으로 궁금한점은 세션을 웹소켓에서 미들웨어로 사용하면 그냥 공유를 할 수 있는 것인가요? 해당 페이지의 설명이 조금 부족한 것 같습니다 ㅜ.
3달 전
모든 미들웨어는 인자로 (req, res, next)를 받습니다. 웹소켓에서 미들웨어로 사용하면 socket.request.session이 생깁니다. 세션미들웨어의 역할이 req 객체에 session 객체를 넣어주는 겁니다.
3달 전
답변 감사합니다. 제로님.

app.use() 에서는 인자들을 받는 예제는 많이 보았는데,

미들웨어 자체에서 사용하는 모습은 처음보았습니다.

보통 미들웨어 세팅 시 다음처럼 설정 후 사용하는 것 같아서요.

app.use(sessionMiddleware);

또 하나 배워갑니다.
3달 전
아 그 내용은 426쪽에 나와 있습니다.
2달 전
제로님. 감사합니다.

372페이지의 2번 설명을 살펴보면 되는군요 미들웨어에서 if 문 처럼 작동방식을 커스터마이징 하기 위해서 예제와 같이 사용하는군요. 감사합니다!
3달 전
안녕하세요! 이번에 책을 갓 산 초보 독자입니다. html, css, javascript의 기초지식을 가지고 있고, 책을 따라 노드공부를 하고 있는데 언어가 너무 어렵고 이해가 안되는부분이 많네요. 이럴때는 책을 보다가 모르는 부분을 따로 공부하면 되는건가요? 아님 javascript를 마스터하고 책을 봐야하나요?
3달 전
마스터까지는 아니고 자바스크립트 문법을 어느 정도 아셔야 합니다. 제 블로그에 있는 자바스크립트(ECMAScript, Javascript 카테고리) 글을 쭈욱 보시면 좋을 것 같습니다. 노드가 자바스크립트 실행기이기 때문에 자바스크립트를 어느 정도 아셔야 합니다. 여기에 질문도 많이 남겨주세요.
3달 전
감사합니다 ^_^
일단 제로초님 ecmasciprt랑 javascript 쭉 훑어 보면서 모르는거 있으면 질문하겠습니다!
다 배우면 제로초님 블로그같은 사이트도 만들수 있겠죠? ㅎㅎ
3달 전
넵 맞습니다!
3달 전
안녕하세요. 노드 교과서 책을 보다가 질문드립니다. 책 202쪽 express-session 부분을 보고 있는데 req.session.name = "abc" 이런식으로 세션 객체에 값을 할당했을 시 크롬 개발자 도구에서 보면 쿠키에 암호화된 문자열이 저장된 것을 확인했습니다(secrete 적용). 그런데 문제는 app.use(session(...)) 이후에 임의의 미들웨어를 만들어서 req.cookies 를 출력해보았는데 빈 객체 {} 가 출력되는데, 왜 빈 객체가 출력되는지 궁금합니다. 쿠키에 값이 있기 때문에 req.cookies 객체에 뭔가 값이 저장되어 있어야 할 것 같은데요.
3달 전
익스프레스 세션의 쿠키는 싸인드쿠키이기 때문에 req.signedCookies 이런 데에 들어 있을 겁니다.
3달 전
아 감사합니다!
3달 전
node.js에서 es6 문법을 사용했을 때 IE 에서도 실행될려면 바벨 이나 웹펙을 사용해야 하나요 사용해야 한다면 사용법 설명 좀 부탁합니다.
3달 전
사용하지 않아도 됩니다. 10버전 기준 es9까지 지원합니다.
4달 전
현재 642페이지 실습 중인데요! 리사이징된 이미지를 불러오는 과정에서 문제가 있는지 제대로 출력이 되질 않네요..
버킷확인해보니깐 thumb 폴더가 없어서 만들어줘도 이미지가 뜨지 않고 엑박만 뜨네요!
터미널상에서는 오류가 없는데 어디가 잘못된걸까요?
4달 전
버킷이 비어있는 거면 버킷에 데이터를 올릴 때 잘못되었을 확률이 높습니다. 리사이징 전의 이미지도 등록이 안 되나요?
4달 전
Original 폴더말씀하시는건가요?? 거기는 제대로 저장됩니다! 게시물 올리기전에 이미지뜨는 것도 제대로 되구요!
4달 전
음 그러면 람다에서 트리거 쪽 설정이 문제인 것 같습니다. 그 부분 확인해보시겠어요?
4달 전
트리거 다시 설정하려고 하는데
맥에서는 zip파일 만들때 압축해제시 바로 index.js 파일이 뜨도록 할 수 있나요??
열심히 구글링을 해도 방법을 못찾겠네요ㅜㅜㅜ
4달 전
274p index.js의
db.User = require("./user")(sequelize, Sequelize);
db.Comment = require("./comment")(sequelize, Sequelize);
부분이 npm start시
require(...) is not a function
에러가 발생하는 부분이 있습니다.

에러메세지로 구글링 해봤을땐
https://stackoverflow.com/questions/33007878/nodejs-typeerror-require-is-not-a-function
이쪽의 지적과는 다르게
책에 적힌데로 sequelize 사용법이 저게 맞는거같은데 오류가 나네요

app.js의 var sequelize = require("./models").sequelize; 부분을 참고하여
db.User = require("./user").sequelize; 같은 형식으로 둘다 바꿔줘도

276p index.js 부분의
db.User.hasMany 쪽 hasMany 속성을 인식하지 못하는 부분에 관해 혹시 팁이 있을까요?
4달 전
혹시 모델 파일에서 return sequelize.define 이 것을 하지 않으신 거 아닌지요? return을 해주어야 hasMany같을 것을 붙일 수 있습니다.
4달 전
마지막 16장 공부 중인데요!
버킷정책을 입력하고 저장하려는데
엑세스가 거부되었습니다라고 뜨네요ㅜㅜ
기본설정 건드린것도 없는데말이죠!
4달 전
aws이신가요? gcp이신가요?
4달 전
아 AWS입니다!
4달 전
아래 댓글에 비슷한 분이 계시던데 한 번 따라해보시겠어요?

아래 aws 관련 질문드린 사람입니다. 문제는 해결했는데
과정이 바뀌었다기 보다, 퍼블릭 액세스 설정 > 퍼블릭 정책관리 > 새퍼플릭 정책 차단 과
퍼블릭 액세스 설정 > 퍼블릭 버킷 정책관리 > 버킷에 퍼블릭 정책이 있는 경우 퍼블릭 액세스 계정 및 계정간 액세스 차단 이 두부분을 false로 설정해 주어야 진행이 되네요!~
4달 전
아래 맥OS에서 mysql 설치오류 문의드렸던 학생입니다!
계속 문제가 생겨서 설치했던 mysql을 삭제 후 다음명령으로 책에서 나온대로 재설치를 했습니다.

sudo brew install mysql@5.7
sudo services start mysql@5.7(책에는 @5.7이 빠져있는 상태인데 오류가나서 @5.7을 붙였습니다)

여기까지 잘 설치가 되었는데

cho@InTaek-MacBookPro:~/Documents/VScode/nodebird$ mysql_secure_installation
-bash: /usr/local/bin/mysql_secure_installation: No such file or directory

여기서 파일을 찾을 수 없다네요..제대로 재설치가 안된걸까요?
4달 전
커맨드라인으로 계속 오류가 난다면 그냥https://dev.mysql.com/downloads/mysql/5.7.html#downloads 에서 dmg 파일로 설치하시는 게 좋을 것 같습니다. 설치 과정에서 설정이 많이 꼬인 것 같습니다.
4달 전
어떻게 해결은 했는데요! npm start로 서버 실행했다가 컨트롤Z로 끈 뒤 다시 재실행하면 다음과 같은 오류가 뜨네요ㅜㅠ
events.js:173
throw er; // Unhandled 'error' event
^

Error: listen EADDRINUSE: address already in use :::8001
at Server.setupListenHandle [as _listen2] (net.js:1254:14)
at listenInCluster (net.js:1302:12)
at Server.listen (net.js:1390:7)
at Function.listen (/Users/cho/Documents/VScode/nodebird/node_modules/express/lib/application.js:618:24)
at Object.<anonymous> (/Users/cho/Documents/VScode/nodebird/app.js:62:5)
at Module._compile (internal/modules/cjs/loader.js:721:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:732:10)
at Module.load (internal/modules/cjs/loader.js:620:32)
at tryModuleLoad (internal/modules/cjs/loader.js:560:12)
at Function.Module._load (internal/modules/cjs/loader.js:552:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:774:12)
at executeUserCode (internal/bootstrap/node.js:499:15)
at startMainThreadExecution (internal/bootstrap/node.js:436:3)
Emitted 'error' event at:
at emitErrorNT (net.js:1281:8)
at processTicksAndRejections (internal/process/next_tick.js:76:17)
at process.runNextTicks [as _tickCallback] (internal/process/next_tick.js:51:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:777:11)
at executeUserCode (internal/bootstrap/node.js:499:15)
at startMainThreadExecution (internal/bootstrap/node.js:436:3)
[nodemon] app crashed - waiting for file changes before starting...

구글링 해보니깐 killall -9 node를 하라고 해서 해보니깐 잘 되는데 다시 재실행하면 위와같은 오류가 또 뜨네요..
매번 저 명령을 칠 수도 없고...어떻게 해결해야할까요?
4달 전
아 해결이됬네요!! 컨트롤 c로 죽여야 말끔하게 죽는군요!
4달 전
expresss 를 사용한 프로젝트에서 절대경로를 설정하는 방법을 알고 싶습니다. 프론트엔드에서 리액트 프로젝트를 할때는 .env에 NODE_PATH=src 를 기재해놓으면 절대경로가 적용되었는데 express에서는 적용이 되지 않습니다. app-root-path 같은 모듈 없이 절대 경로를 설정하는 방법이 있으면 알고 싶습니다.
혹 방법이 없다면 모듈 추천 부탁드립니다 감사합니다~
4달 전
저는 절대 경로를 쓰지 않아서 이건 잘 모르겠습니다.
4달 전
현재 15장 학습을 위해서 nodebird 소스를 받아서 사용 중인데요
sequelize db:create 를 하면


Sequelize CLI [Node: 11.7.0, CLI: 5.4.0, ORM: 4.42.0]

Loaded configuration file "config/config.json".
Using environment "development".

ERROR: Client does not support authentication protocol requested by server; consider upgrading MySQL client

이런 오류가 뜨네요ㅜㅜㅜ대체 뭐땜에 그런걸까요??
현재 맥북으로 학습 중입니다!
4달 전
MySQL 5.7 버전을 설치하셨나요? 버전을 확인해주셔야 할 것 같습니다! 느낌이 8 버전을 설치하신 것 같아요~
4달 전
cho@InTaek-MacBookPro:~$ brew services list
Name Status User Plist
mongodb started root /Library/LaunchDaemons/homebrew.mxcl.mongodb.plist
mysql started root /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
mysql@5.7 stopped

cho@InTaek-MacBookPro:~$ brew services start mysql
Error: Permission denied @ rb_sysopen - /Users/cho/Library/LaunchAgents/homebrew.mxcl.mysql.plist

cho@InTaek-MacBookPro:~$ sudo brew services start mysql
Password:
Service `mysql` already started, use `brew services restart mysql` to restart.

cho@InTaek-MacBookPro:~$ sudo brew services start mysql@5.7
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)

cho@InTaek-MacBookPro:~$ brew services list
Name Status User Plist
mongodb started root /Library/LaunchDaemons/homebrew.mxcl.mongodb.plist
mysql started root /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
mysql@5.7 started root /Library/LaunchDaemons/homebrew.mxcl.mysql@5.7.plist

cho@InTaek-MacBookPro:~$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

5.7로 설치하고 해봤는데 마지막과 같은 에러가 뜨네요ㅜㅜㅜ뭐가 잘못된가요?
4달 전
brew 앞에 다 sudo 붙여보세요
4달 전
Last login: Sun Feb 10 17:18:34 on ttys000
cho@InTaek-MacBookPro:~$ sudo brew services list
Password:
Name Status User Plist
mongodb started root /Library/LaunchDaemons/homebrew.mxcl.mongodb.plist
mysql started root /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
mysql@5.7 started root /Library/LaunchDaemons/homebrew.mxcl.mysql@5.7.plist

cho@InTaek-MacBookPro:~$ sudo brew services start mysql
Service `mysql` already started, use `brew services restart mysql` to restart.

cho@InTaek-MacBookPro:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
cho@InTaek-MacBookPro:~$

뭐 똑같네요....ㅠㅠㅠ
4달 전
에러 메시지에 답이 있는데요. sudo붙여서 리스타트해보세요
4달 전
cho@InTaek-MacBookPro:~$ sudo brew services list
Password:
Name Status User Plist
mongodb started root /Library/LaunchDaemons/homebrew.mxcl.mongodb.plist
mysql started root /Library/LaunchDaemons/homebrew.mxcl.mysql.plist
mysql@5.7 started root /Library/LaunchDaemons/homebrew.mxcl.mysql@5.7.plist

cho@InTaek-MacBookPro:~$ sudo brew services restart mysql
Stopping `mysql`... (might take a while)
==> Successfully stopped `mysql` (label: homebrew.mxcl.mysql)
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)

cho@InTaek-MacBookPro:~$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

똑같습니다ㅠㅠ
5달 전
525페이지에서 맨위쪽 코드보면
async
defer
src="~"
이런 코드가 있는데 각 라인당 어떤 역할인지 알고 싶네요ㅜㅜ프런트쪽이라 설명이 없는건가요??
5달 전
구글맵에서 그냥 저렇게 하라고 한 겁니다. 설명드리자면 스크립트 코드를 비동기적으로 불러올 수 있게 됩니다.
5달 전
삭제
5달 전
아래 댓글이 연속으로 안달아져서 여기 이어답변 남깁니다.

아니요 수정한부분은 없습니다..
현재 작성한 소스코드가 올라와있는 주소는
https://github.com/rlawnsxo131/node.js-practice2/blob/master/10.nodebird(gcp)/routes/post.js

.zip 으로 업로드한 소스코드는
https://github.com/rlawnsxo131/node.js-practice2/tree/master/10.nodebird-gcp-upload
입니다 문제를 못찾겠네요..ㅜ
5달 전
아래 질문 드린 사람입니다!
chrome 개발자 도구에 console에는 아래 에러가 나오고

(index):19 POST http://localhost:8001/post/img 500 (Internal Server Error)

(anonymous) @ (index):19
(index):15 <!DOCTYPE html><html><head><meta charset="UTF-8"><title></title><meta name="viewport" content="width=device-width, user-scalable=no"><meta http-equiv="X-UA-Compatible" content="IE=edge"><link rel="stylesheet" href="/main.css"></head><body><div class="container"><div class="profile-wrap"><div class="profile"><form id="login-form" action="/auth/login" method="post"><div class="input-group"><label for="email">이메일</label><input id="email" type="email" name="email" required autofocus></div><div class="input-group"><label for="password">비밀번호</label><input id="password" type="password" name="password" required></div><a class="btn" id="join" href="/join">회원가입</a><button class="btn" id="login" type="submit">로그인</button><a class="btn" id="kakao" href="/auth/kakao">카카오톡</a></form></div><footer>Made by <a href="https://instagram.com/jun_xxoo" target="_blank">Juntaakim</a></footer></div><h1>Not Found</h1><h2></h2><pre></pre></div></body></html>

GCP Cloud Function 로그에는

yhstsam7g5c1
Function execution took 16 ms, finished with status code: 500 과

{
insertId: "000000-e113c6ea-0f8b-466f-9785-0abe11576509"
labels: {…}
logName: "projects/node-depoly-228016/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
receiveTimestamp: "2019-01-09T03:09:15.698332358Z"
resource: {…}
severity: "ERROR"
textPayload: "Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
at ServerResponse.header (/var/tmp/worker/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/var/tmp/worker/node_modules/express/lib/response.js:170:12)
at exports.resizeAndUpload (/user_code/index.js:8:25)
at /var/tmp/worker/worker.js:725:7
at /var/tmp/worker/worker.js:708:11
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)"
timestamp: "2019-01-09T03:09:09.414Z"
trace: "projects/node-depoly-228016/traces/5876e19027eb5e5d577ecf6e072dd079"
}
에러가 나네요... 번거롭게 해드려 죄송합니다. 그리고 답변 감사합니다!
5달 전
저 에러는 res의 메서드(res.json, res.send 등등)을 두 번 이상 사용했을 때 발생합니다. 혹시 서버쪽 코드를 수정하셨나요?
5달 전
cloud functions부분 649~진행중입니다.
마지막까지 진행했으나 에러가 발생하네요. 제로초님의 깃험 소스들을 모두 복사하고 저장소나 버킷등은 변경해 실험해봤으나 역시 에러가 발생합니다.
에러가 나는 부분은 veiws/main.pug 의
if (document.getElementById('img')) {
document.getElementById('img').addEventListener('change', function (e) {
var formData = new FormData();
console.log(this, this.files);
formData.append('img', this.files[0]);
var xhr = new XMLHttpRequest();
xhr.onload = function () {
if (xhr.status === 200) {
var url = JSON.parse(xhr.responseText).url;
var originalUrl = JSON.parse(xhr.responseText).originalUrl;
document.getElementById('img-url').value = url;
document.getElementById('img-preview').src = originalUrl;
document.getElementById('img-preview').style.display = 'inline';
} else {
console.error(xhr.responseText);---------이부분과
}
};
xhr.open('POST', '/post/img');
xhr.send(formData);-------------------------- 이 부분
});
에러 내용을 보아선 cors문제인것 같기도 한데 routes/post.js
router.post('/img', isLoggedIn, upload.single('img'), (req, res, next) => {
console.log('req.file:', req.file);
axios.get(`https://us-central1-node-depoly-227613.cloudfunctions.net/gcp-upload?filename=${req.file.filename}`)
.then((response) => {
const filePath = req.file.path.split('/').splice(0, 3).join('/');
const originalUrl = `${filePath}/${req.file.filename}`;
const url = `${filePath}/${response.data}`;
res.json({ url, originalUrl });
})
.catch((error) => { -----------이부분
console.error(error);
next(error);
});
});
인데 혹시 AWS처럼 GCP에도 권한에대한 변경사항을 처리해야 하는 부분이 생겼는지 질문 남깁니다.
그부분이 아니라면 제 코드가 문제일테니 다시 문제 찾아보겠습니다...
5달 전
에러메시지를 올려주시지 않으면 저는 해결해드릴 수가 없습니다. 에러 메시지가 제일 중요합니다.
5달 전
아래 aws 관련 질문드린 사람입니다. 문제는 해결했는데
과정이 바뀌었다기 보다, 퍼블릭 액세스 설정 > 퍼블릭 정책관리 > 새퍼플릭 정책 차단 과
퍼블릭 액세스 설정 > 퍼블릭 버킷 정책관리 > 버킷에 퍼블릭 정책이 있는 경우 퍼블릭 액세스 계정 및 계정간 액세스 차단 이 두부분을 false로 설정해 주어야 진행이 되네요!~
5달 전
안녕하세요! 현재 496쪽 공부중인데요! 스크립트 부분에

if (xhr.status === 200) {
e.target.bid.value = '';
e.target.msg.value = '';
errorMessage.textContent = '';
}

이런식으로 되어 있으면 form태그에서 받아온 값을 ''으로 초기화해주는 거여서 나중에
xhr.send(JSON.stringify({
bid: e.target.bid.value,
msg: e.target.msg.value,
})

에서도 입력받은 값이 아닌 ''으로 값을 전송해주는 형태인거 아닌가요??
잘 돌아가긴 하는데 제가 어느 부분에서 이해를 잘못 한건가요??
5달 전
bid.value 이 부분은 input 태그의 값입니다. input 태그의 value는 인풋에 키보드 입력시 변합니다.
5달 전
입찰버튼을 누르면 xhr.onload() 함수가 실행되고
input태그에 있던 값이 bid.value로 넘어가는 건 알겠는데
지금 코드를 보면
bid.value='';
으로 되어있으니 넘어오는 값을 무시하고 ''로 초기화되는거 아닌가요?
5달 전
xhr.onload는 입찰이 서버에서 잘 처리된 후에 실행됩니다. 다음 입찰을 받기 위해 input을 비우는 것입니다. 즉, bid.value = '';는 모든게 끝난 후 실행되는 것입니다.