묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
portfolio review 코드 말고 수업 예제 코드는 없을까요?
컴퓨터를 교체해서 앞에 수업했던 파일들이 다 날아갔는데 강의 뒷부분에서 재활용 되는 경우가 있더라구요.. 깃허브에는 포폴용 과제만 샘플 코드가 제공되는 것 같아서 혹시 수업 파일도 올려주실 수 있으실까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
회원 가입 페이지 기능 생성(3) 중 에러
회원가입 버튼을 눌렀을 시, 해당 오류가 발생합니다.
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
tsc compile 관련 질문
1. tsc로 compile하고 난 후 지정된 경로 저장을 하였을 때기존 ts파일과 compile된 js파일문아니라 js.map 이라는 파일이 함께 생성됩니다. js.map 이라는 파일은 어떤 파일인지 여쭤보고 싶습니다 npm run start:dev 로 실행했을 경우 import * as express from 'express'; import { Cat, CatType } from './app.model'; const app:express.Express = express(); const data = [1,2,3,4,5,6,7,8,9,10]; app.get('/',(req:express.Request,res:express.Response) => { // res.send({data}); res.send({ cats:Cat }); }); app.listen(8000, () => { console.log('Server is running on port 8000'); }) 위처럼 실행한 후res.send({data}) 의 주석을 풀면 오류가 발생하고중단 후 재실행하면 정상작동합니다.tsc-watch --onSuccess \"node dist/app.js\"위 script가 nodemon처럼 안정화가 되지 않아서 발생하는 오류인가요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
피그마 코드가 안보여서 실습하기가 너무힘들어요
개발자도구도 안켜지고 입문자용 강의인데 눈대중으로 만들어보라는것도 좀.. 노션에라도 따로 어떤식으로 진행해야한다고 적어주셨으면 하네요 그래도 돈을 몇십만원 주고 진행하는 강의인데..
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
해시태그 검색관련 질문있습니다.
자주 질문을 드려 죄송합니다. ㅠㅠ 모르는게 많아서 ㅠㅠ그 해시태그 부분을 작업 하고 있는데 제가 해시태그를 클릭하게 되면 예를 들러 123123을 클릭을 한다 라고 하면 기존 아래에서 검색이 될시 이런식으로 해시태그가 123123만 나오고 나머지 것들은 안나오는 현상이 나오고 있습니다. 코드 같은 경우는 알려주신데로 router.get("/:hashtag", async (req, res, next) => { try { const users = req.user ? req.user.id : null; const offset = (parseInt(req.query.page) - 1) * 10 || 0 const { count, rows: post } = await Post.findAndCountAll({ offset: offset, limit: 10, // DESC 최신순 ASC 오래된순 order: [ ["createdAt", "DESC"] ], include: [ { model: Hashtag, where: { hashtag: req.params.hashtag }, attributes: ["hashtag"], through: { attributes: [] }, }, { model: Image, attributes: ["src"], },{ model: User, attributes: ["nickName"], }], attributes: [ "id", "title", "createdAt", "view", "content", // 좋아요 수 [Sequelize.literal("(SELECT COUNT(*) FROM `Like` WHERE `Like`.`postId` = `Post`.`id`)"), "count"], // 좋아요 여부 [Sequelize.literal("IF((SELECT `postId` FROM `Like` WHERE `Like`.`postId` = `Post`.`id` AND `Like`.`userId` = " + users + "), 1, 0)"), "like"], ], }) const posts = post.map((post) => { const format = post.toJSON() format.hashtag = format.Hashtags.map((tag)=>tag.hashtag) format.src = format.Images.map((img) => img.src).join("") format.nickname = format.User.nickName format.content = format.content.replace(/<[^>]+>|<img.*?>/g, ""); delete format.Images; delete format.User; delete format.Hashtags; return format; }) res.status(201).json({ count, posts }) } catch (error) { console.error(error) next(error) } })이렇게 작성을 하였는데 찾아 보니 where: { hashtag: req.params.hashtag },이렇게 작성을 하게 되면 해당 해시태그에 해당하는 게시물이 불러와 지기는 하는데 검색된 해시태그만 뽑아서 나타나지게 되니 where: { hashtag: { [Op.contains]: [`${req.params.hashtag}`] } },이런식으로 작성을 하면 된다고 해서 써봣는데 "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''asd' LEFT OUTER JOIN Images AS Images ON Post.`id` = Images.`PostId` LE' at line 1", sql: "SELECT count(`Post`.`id`) AS count FROM Posts AS Post INNER JOIN ( PostHashtag AS Hashtags->PostHashtag INNER JOIN Hashtags AS Hashtags ON Hashtags.`id` = Hashtags->PostHashtag.`HashtagId`) ON Post.`id` = Hashtags->PostHashtag.`PostId` AND Hashtags.`hashtag` <@ 'asd' LEFT OUTER JOIN Images AS Images ON Post.`id` = Images.`PostId` LEFT OUTER JOIN Users AS User ON Post.`UserId` = User.`id`;",이런 에러가 나더라구요... 왜 images에 관련된 문구가 나오는지는 모르겟지만.... 혹시 mysql에서 contains메소드가 사라진건지 아닌지 혹시 고칠수 잇는건지 궁금합니다.제 sequelize 버전은 6.35.2 입니다. ㅠㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
피그마에서 코드가 안보임
해당 강의 내용에서 피그마 사이트에 입장하면, 코드가 보이지 않습니다. 혼자 스스로 코드를 짜보려고 하는데, 아직은 도움이 필요하여 찾아보니 유료 버전을 구입해야 보인다고 하는데..이럼 학습 진도는 어떻게 나가나요...? 속상합니다.
-
미해결[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
TodoList 검색기능과 탭기능에 대한 질문
투두리스트를 만들고 있습니다.ui는 디자인은 하지 않았고, 기능만 구현하고 있습니다.사실 원하는 모든기능은 구현했는데 아래 두가지가 중첩되지 않습니다. 코드를 봐주시면 감사하겠습니다. 1. 탭 : (all,active,completed)을 배열 반복문으로 나타나게했고 클릭하면 체크박스 값이 변동됨에에 따라 상단에는 length가 나타 나게되고 ui에도 (all,active,completed)에따라 보여지게 됩니다. 2. 검색 : 인풋 체인지시 하단의 todo추가인풋의 값이 includes.(targetvalue상태)에 맞춰서 ui로 보여집니다. 위 코드는 검색 기능 코드입니다. 위코드는 탭메뉴 코드입니다. todos라는 최초 배열을 반복문으로 보여주다가 위 함수의 상태를 따로 return해줘서새로운 변수 newArray를 만들어서 ui상으로 다시 반복문으로 나타내고 있습니다 searchFilter와 getFilterdItem 함수를 합칠수가 없는데요,어떻게하면 newArray배열을 이용하여 ui상으로 두개의 함수를 모두 나타낼수 있을까요? 혹은 다른 방법이 있다면 알려주신다면 대단히 감사하겠습니다 ㅠㅠ
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
새로운 강의버전은 언제 나오나요 ?
새소식에 올라온 솔로트립을 기반으로 한 새로운 강의는 언제쯤 올라오나요?
-
해결됨비전공자를 위한 진짜 입문 올인원 개발 부트캠프
현재 강의 Express 프레임워크 사용하기 를 듣고 있는데요
이전 강의인 그랩 마켓 서버 구축하기 에서는 node_modules가 없었는데 이번 강의부터는 생성 되어있습니다.생성 과정을 건너뛰셨다면 어디서 확인할 수 있는지는 강의에 포함시켜주시는게 맞는거 같습니다.
-
미해결[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
Slider은(는) JSX 구성요소로 사용할 수 없습니다. 오류가 발생해요ㅠㅠ
이 문제가 해결이 안돼서 진도를 못나가고 있습니다ㅜㅜ구글링하니 버전이 달라서 그렇다고 해서 package.json파일도 삭제하고 다시 설치하고 이것저것 다 해봤는데도 도저히 해결이 안되네요.. 살려주세요ㅠㅠㅠ
-
해결됨Vue로 Nodebird SNS 만들기
강의는 언제까지 업데이트 된 내용인가요?
오랜만에 다시 강의를 들어보려고 하는데 최근 Vue 업데이트가 많아서 최신버전에서도 문제 없이 작동할지 모르겠네요. Vue3 기반으로 작업해도 문제 없을까요?
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
이런경우 npm i nodemon -g 로 설치하는게 더 나은게 아닌가요??
제가 알기로 npm의 경우 -g 라는 글로벌 설치 기능이 존재해서현재 위치에 한정되지 않고 사용이 가능한걸로 알고 있습니다. 앞선 강의에서 빠른 속도등의 이유로 yarn을 쓴다고 하셨지만,nodemon 같이 여러 폴더에서 사용하는 경우에는 npm 글로벌 설치를 하는게, 계속 설치를하고 실행문을 설정해주고 하는 번거러움 같은 측면을 따져본다면 더 좋은 방법이지 않나 하는 생각이 듭니다. 이번 강의에서 yarn과 npm을 혼용해서 쓰지 않는게 좋다고 하셨지만, 글로벌 설치를 하는게 유리한 경우는 npm을 써서 글로벌 설치를 하는게 더 나은지, 아니면 그래도 혼용을 해서 쓰면 안되는지, 그렇다면 yarn이 글로벌 설치가 가능한 npm을 안쓰면서 쓸 장점이 속도 말고 다른게 있는지 궁금합니다.
-
미해결조코딩의 코딩 기초와 웹 풀스택 개발
livesurver가 작동이 안돼요.
안녕하세요, 강의를 보던 중 궁금한게 있어서 문의 드립니다. 라이브서버를 다운받고 'open with live surver' 를 눌렀는데 크롬에서 영상처럼 연동이 안되네요. 인터넷 찾아보면서 세팅설정도 바꿔보고 했는데도 안되네요. 뭐가 문제인지 알려주실 수 있으신가요?
-
해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
빌드 파일의 일부 페이지에서 이미지 파일이 제대로 불러와지지 않습니다.
빌드 폴더가 아닌 오리지널 폴더로 npm start로 확인했을 때에는 알맞게 사진이 불러와집니다. 하지만 빌드 후에 serve 명령으로 실행했을 때에 Diary.js , Edit.js에서 사진을 제대로 불러오고 있지 않습니다. 제가 콘솔로 확인했을 때에 이미지의 상대 주소는 잘 찍히고 있는 것 같은데, 어디에서 빌드 후에 문제가 생기는 건지 잘 모르겠습니다. 깃허브 주소 남깁니다.https://github.com/yminjuu/Emotion-Diary
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스
코드 리팩토링 이렇게 해도 되나요??
수업 내용 코드는function checkPhone(myphone) { if (myphone.length < 10 || myphone.length > 11) { console.log("에러 발생!!! 핸드폰 번호를 제대로 입력해 주세요!!!"); return false; } else { return true; } } function getToken() { let result = String(Math.floor(Math.random() * 100000)).padStart(6, "0"); console.log(result); return result; } function sendTokenToSMS(myphone, result) { console.log(myphone + "번호로 인증번호" + result + "를 전송합니다."); } function createTokenOfPhone(myphone) { const isValid = checkPhone(myphone); if (isValid === false) return; const mytoken = getToken(); sendTokenToSMS(myphone, mytoken); } createTokenOfPhone("01012345678"); // 01012345678: 인자(argument) 이렇게 되어있는데createTokenOfPhone 함수에서 isValid 상수를 꼭 선언해야하나요?? function checkPhone(myphone) { if (myphone.length < 10 || myphone.length > 11) { console.log("에러 발생!!! 핸드폰 번호를 제대로 입력해 주세요!!!"); return true; } } function getToken() { let result = String(Math.floor(Math.random() * 100000)).padStart(6, "0"); console.log(result); return result; } function sendTokenToSMS(myphone, result) { console.log(myphone + "번호로 인증번호" + result + "를 전송합니다."); } function createTokenOfPhone(myphone) { if (checkPhone(myphone)) return; const mytoken = getToken(); sendTokenToSMS(myphone, mytoken); } createTokenOfPhone("01012345678"); // 01012345678: 인자(argument) 이렇게 checkPhone()이 문제있을 때만 true를 반환하고,checkPhone()이 true일 경우 return 처리하면 코드가 더 짧아지기는 하는데수업에서 말씀하시는 협업의 가독성을 위해서 isValid라는 상수를 선언해줘야 하는지 아니면 제가 생각한 방식으로 코드를 줄여도 괜찮은건지 궁금합니다.
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)
Entity에 toJSON 코드 입력 후 404 에러
Entity.ts에 추가한 toJSON() { return instanceToPlain(this); }이 코드가 들어가면 404에러가 뜹니다. 저 코드를 빼면 돌아가긴 합니다만 이미지(아바타)가 안보이고요.. 그리고 이런 에러가 나서 구글링 한 후 config를 이렇게 바꿨는데, 이게 문제인가.. 싶기도 하고요.. 너무 궁금한데 제발 꼭 좀 아시는 분 답변 부탁드려요
-
해결됨[2024] 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
originData.id 대신 useParams로 받은 id를 사용하여 삭제하면 안되는 이유
LocalStorage 사용 강의의 16분 50초 부근 "삭제하기" 버튼 관련 질문입니다.처음에 혼자 구현을 하려고 할 때 originData.id 대신 id를 onRemove에 파라미터로 전달했을 때 작동이 안됐는데 originData.id로 해야 삭제되더라고요. 콘솔로 찍었을 때 둘 다 일기 데이터의 id로 같은 걸 가리키는 것으로 나오는데 제가 잘못 알고 있는 부분이 있을까요? 안되는 이유가 무엇인가요? const handleDelete = () => { if (window.confirm("정말 삭제하시겠습니까?")) { console.log(id); console.log(originData.id); onRemove(originData.id); navigate("/", { replace: true }); } };
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
[에러 해결] 콜백 관련 오류 나오시는 분들
promise chain 적용하여 코드를 변경했습니다. 참고하시면 좋을 거 같아요! // index.jsapp.post('/api/users/logout', auth, (req, res) => { User.findOneAndUpdate({ _id: req.user._id }, { token: "" }) .then(() => { return res.status(200).json({ logoutSuccess: true }); }) .catch((err) => { return res.status(400).json({ logoutSuccess: false, message: err.message }); }) })// auth.jsfunction auth(req, res, next) { // 쿠키에서 토큰 가져오기 const token = req.cookies.x_auth; console.log("token is ", token); // 토큰 복호화 및 유저 검색 User.findByToken(token) .then((user) => { if (!user) { throw new Error("유효하지 않은 토큰입니다."); } // 토큰과 유저정보를 다음 단계로 전달함. req.token = token; req.user = user; return next(); }) .catch((err) => { return res.status(401).json({ isAuth: false, message: err.message }); }) }// User.jsuserSchema.statics.findByToken = function(token) { const user = this; return util.promisify(jwt.verify)(token, 'secretToken') .then((decoded) => { console.log(decoded); return user.findOne({ "_id": decoded, "token": token }); }) .catch((err) => { console.log(err); throw new Error("유효하지 않은 토큰입니다."); }); }
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
[에러 해결] (function) no longer accepts a callback
이제는 promise chain이나 async await 문으로 콜백함수를 처리해야 하는 것으로 보입니다. 다음과 같이 코드를 수정해서 돌아가는 것을 확인했으니 활용하시면 좋을 것 같아요! // index.jsapp.post('/login', (req, res) => { // 이메일이 DB에 있는지 확인 User.findOne({ email: req.body.email }) .then (async (user) => { if (!user) { throw new Error("제공된 이메일에 해당하는 유저가 없습니다.") } // 비밀번호가 일치하는지 확인 const isMatch = await user.comparePassword(req.body.password); return { isMatch, user }; }) .then(({ isMatch, user }) => { console.log(isMatch); if (!isMatch) { throw new Error("비밀번호가 틀렸습니다.") } // 로그인 완료 return user.generateToken(); }) .then ((user) => { // 토큰 저장 (쿠키, localstorage ...) return res.cookie("x_auth", user.token) .status(200) .json({ loginSuccess: true, userId: user._id }); }) .catch ((err) => { console.log(err); return res.status(400).json({ loginSuccess: false, message: err.message }); }) }); // User.jsuserSchema.pre('save', function( next ) { // 비밀번호 암호화 const user = this; if(user.isModified('password')) { bcrypt.genSalt(10, function(err, salt) { if (err) { return next(err); } bcrypt.hash(user.password, salt, function(err, hash) { if (err) { return next(err); } user.password = hash; return next(); }); }); } else { return next(); } }); userSchema.methods.comparePassword = function(plainPassword) { // 암호화된 비밀번호와 같은지 체크 const user = this; return bcrypt.compare(plainPassword, this.password) } userSchema.methods.generateToken = function() { // jwt 생성 user = this; const token = jwt.sign(user._id.toJSON(), 'secretToken'); user.token = token; return user.save(); }
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
id도 잘 불러오는데 토큰이 삭제가 안됩니다 .......
index.js app.get('/api/users/logout', auth, (req,res)=>{ // Usermodel에서 id를 찾고 token을 지워줌 User.findOneAndUpdate({ _id: req.user._id }, { token: "" }) console.log(req.user._id) try{ return res.status(200).send({ success: true }) } catch(err){ return res.json({ success: false, err }); } })auth.js let auth = (req, res, next)=> { // 인증 처리를 하는 곳 // client 쿠키에서 토큰을 가져온다. let token= req.cookies.x_auth; // 토큰을 복호화 후 유저를 찾는다. User.findByToken(token, (err,user)=>{ if(err) throw err; if(!user) return res.json({ isAuth: false, error: true}) req.token= token; req.user= user; next(); })User.js userSchema.statics.findByToken= function(token, cb){ var user= this; //토큰 디코드 jwt.verify(token,'secretToken', function(err, decoded){ //유저 아이디를 이용하여 유저를 찾은 후 // 클라이언트에서 가져온 token과 DB에 보관된 TOKEN이 일치하는지 확인 user.findOne({"_id": decoded, "token": token}) .then((user)=>{ cb(null, user); }) .catch((err)=>{ return cb(err); }) }) }index.js / auth.js / User.js 첨부하겠습니다.도저히 왜 토큰이 DB에서 사라지지 않는지 궁금합니다 ㅠㅠ