묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
nodebird 프로필 수정 기능 구현 시, 에러가 발생했을 때 에러처리미들웨어에서 res.render('error')가 안되는 상황
프로필 수정 기능을 구현하기 위한 profileUpdate.html{% extends 'layout.html' %} {% block content %} <div class="timeline"> <form id="profile-update-form"> <!-- <div class="input-group"> <label for="join-email">이메일</label> <input id="join-email" type="email" name="email" /> </div> --> <div class="input-group"> <label for="join-nick">닉네임</label> <input id="join-nick" type="text" name="nick" /> </div> <div class="input-group"> <label for="join-password">비밀번호</label> <input id="join-password" type="password" name="password" /> </div> <button id="join-btn" type="submit" class="btn">수정</button> </form> </div> {% endblock %} {% block script %} <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> window.onload = () => { const errorParam = new URL(location.href).searchParams.get('error'); if (errorParam) { alert(errorParam); } }; if (document.getElementById('profile-update-form')) { document.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(event.target); const config = { headers: { 'content-type': 'application/json', }, }; axios .put('/profile/update', formData, config) .then((res) => { alert('프로필 정보가 수정되었습니다.'); window.location.href = '/profile'; }) .catch((error) => { alert(error); }); }); } </script> {% endblock %} 그리고 controller/page.jsexports.renderProfileUpdate = (req, res, next) => { res.render('profileUpdate', { title: '내 정보 수정 - NodeBird' }); }; exports.profileUpdate = async (req, res, next) => { try { const { nick, password } = req.body; const id = req.user.id; const exUser = await User.findOne({ where: { id } }); if (!exUser) { throw new Error('존재하지 않는 사용자입니다.'); // res.status(404).send('no user'); } const sameNickUser = await User.findOne({ where: { nick, id: { [Op.ne]: exUser.id, }, }, }); if (sameNickUser) { throw new Error('중복된 닉네임입니다.'); // res.status(501).send('중복된 닉네임입니다.'); } const hash = await bcrypt.hash(password, 12); exUser.set({ nick, password: hash, }); await exUser.save(); res.status(201).send(); } catch (error) { console.error(error); next(error); } };app.js의 에러처리 미들웨어app.use((err, req, res, next) => { // 404 다음은 에러처리 미들웨어 console.error('에러는 ', err.message); res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; // 보안상 위험(오히려 배포 시 사용자 화면에 에러를 숨김) // 에러를 로깅 서비스에 넘김 res.status(err.status | 500); res.render('error'); // views/error.html });일부러 중복된 닉네임을 넣어 라우터에서 에러를 발생시켰을 때, 에러처리미들웨어의 console.error('에러는 ', err.message); 부분에서 "Error: 중복된 닉네임입니다. at exports.profileUpdate (/nodestudy/nodebird/controllers/page.js:31:13) at process.processTicksAndRejections (node:internal/process/task_queues:95:5)에러는 중복된 닉네임입니다.PUT /profile/update 500 10.568 ms - 1862" 로 에러 메시지가 정상적으로 찍히는 것을 확인하였습니다.preview 탭에선 정상적으로 나오는 것 같은데, 실제 브라우저 화면에선 위와 같이 뜨면서 제가 원하는 에러 메시지('중복된 닉네임입니다')가 alert 창에 뜨지 않으며, error.html이 렌더링도 되지 않고 있습니다. 구글링해봐도 제가 잘 못한건지 이유를 못찾겠습니다🥲 제가 뭘 놓친걸까요?
-
해결됨[개정3판] Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize 대신 mongoose를 사용하는 이유
12장 프로젝트는 sequelize로도 구현이 가능할 텐데, seqeulize 대신 mongoose를 사용하신 이유가 궁금합니다. mongoose를 사용하는 것이 더 좋은 성능을 보이나요?
-
미해결
sequelize cascade 옵션을 사용해서 delete 할때
안녕하세요.웹 프로젝트를 진행하면서 궁금한 점이 있어서 질문드립니다.mysql과 sequelize를 사용하며users 테이블과 contents 테이블이 1:N 관계를 가지고 있습니다.그래서 users 데이터를 delete 할 때 자식으로 묶인 contents 데이터들을cascade 옵션을 통해 같이 delete 시키고자 합니다.models/contents.jsmodels/users.js 이때 그냥 삭제시키는 게 아니라 users 테이블과 contents 테이블 모두paranoid 옵션을 통해 deletedAt을 생성시키고 삭제된 날짜를 찍히게 하고자 하는데현재 user를 delete 하면 user는 삭제가 되어 deletedAt이 잘 나오지만 content는 삭제가 되지 않아deletedAt이 나오지 않는 상황입니다.구글링을 통해 여러 방법을 시도해 보았지만 해결되지 않아 질문드립니다.hooks나 api를 사용하지 않고 cascade를 통해 자식 요소까지삭제되면서 deletedAt이 잘 나올 수 있는 효과적인 방법이 있을까요?
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
sequelize 질문
안녕하세요~! 강의 잘들었습니다. 궁금한 것이 있는데요 강의에서는 sequelize models에서 테이블 정의를 해주고 생성해주면서 실습을 하는데요 혹시 workbench로 데이터베이스와 테이블을 미리 만들어 놓고(models에서 테이블 생성 x) sequelize로 workbench에서 만든 테이블을 가져오고 crud를 해줄 수 있나요>? 가능하면 방법 알고 싶습니다!
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Post 정보에서 태그 정보를 같이 받아오려고 합니다..
안녕하세요 제로초님 노드버드 강좌를 보면서 열심히 공부 중이며 노드버드에서 배운 부분을 조금씩 응용해보려고 하는 중에 질문이 있어서 이렇게 글을 쓰게 되었습니다. 우선 수업과 동일하게 Post table, Tag table이 M:N 다대다 관계를 설정하여 PostTag 라는 테이블이 생성되었습니다. 이것을 이용해서 게시글(Post) 정보를 한번에 불러올때 각 게시글마다 존재하는 태그들도 같이 받아오고 싶습니다. 제가 시도한 방법으로는 findAll 에서 include를 이용해서 받아오려고 했지만 실패했습니다. 제가 설정한 관계와는 맞지 않는 코드의 형태로 에러 메세지가 나오는 것 같습니다. sql 쿼리문의 조인에 대해 지식이 부족하다고 생각하여 조인 부분을 찾아보고 공부를 해도 sequelize 로 어떤식으로 풀어가야 할 지 모르겠습니다 ㅠㅠ 먼저 테이블 정보 입니다. 제가 작성한 코드 부분입니다. 마지막으로 에러메세지 입니다
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈 질문드립니다..
안녕하세요 강사님 ch7에 해당하는 Sequelize 실습에서 hasMany - belongsTo 를 테이블 이름에 칼럼 만바꿔서 테스트를해보니 다음과 같은 에러가 계속 발생하였습니다. 강의에서 users ----------- comments 관계처럼 kakao ------------ talk 로 같은 관계로 테스트하였습니다. 1. kakao.js const Sequelize = require('sequelize'); module.exports = class Kakao extends Sequelize.Model { static init(sequelize) { return super.init({ name : { type : Sequelize.STRING(20), allowNull : false, unique : true, }, job : { type : Sequelize.STRING(30), allowNull : true, }, sex : { type : Sequelize.STRING(2), // 남자,여자 allowNull : false, }, created_at : { type : Sequelize.DATE, allowNull : false, defaultValue : Sequelize.NOW, }, },{ sequelize, timestamps : false, // 강제로 createAt,updatedAt 칼럼 만들지 말아줘 undescored : false, // 스네이크 케이스로 사용할꺼야 modelName : 'Kakao', tableName : 'kakao', paranoid: false, charset: 'utf8', collate: 'utf8_general_ci', }); } static associate(db) { db.Kakao.hasMany(db.Talk, { foreignKey: 'nicName', sourceKey: 'id' }); } }; 2.talk.js const Sequelize = require('sequelize'); module.exports = class Talk extends Sequelize.Model { static init(sequelize) { return super.init({ talk : { type : Sequelize.STRING(100), allowNull : true, }, created_at : { type : Sequelize.DATE, allowNull : false, defaultValue : Sequelize.NOW, }, },{ sequelize, timestamps: false, modelName : 'Talk', tableName : 'talk', paranoid: false, charset: 'utf8mb4', collate: 'utf8mb4_general_ci', }); } static associate(db) { db.Talk.belongsTo(db.Kakao, { foreignKey: 'nicName', targetKey: 'id' }); } }; 3. index.js const Sequelize = require('sequelize'); const Kakao = require('./kakao'); const Talk = require('./talk'); // NODE_ENV가 정의되지않으면 개발모드! const env = process.env.NODE_ENV || 'development'; const config = require('../config/config')[env]; const db = {}; // DB ID PWD Config_File const sequelize = new Sequelize(config.database, config.username, config.password, config); db.sequelize = sequelize; db.Kakao = Kakao; db.Talk = Talk; console.log(sequelize); Kakao.init(sequelize); Talk.init(sequelize); Kakao.associate(sequelize); Talk.associate(sequelize); module.exports = db; 어떤차이가 있는걸까요..? 저는 db.Kakao.hasMany(db.Talk, { foreignKey: 'nicName', sourceKey: 'id' }); db.Talk.belongsTo(db.Kakao, { foreignKey: 'nicName', targetKey: 'id' }); 이두줄을 kakao는 테이블의 고유한 pk가 talk테이블에 많다.(칼럼으로서는 id) 즉 talk 테이블에서 nicName이라는 칼럼을 foreignkey으로 사용하겠다.(kakao의 id를 가지고서) 라고 생각했습니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
sequelize migration에 대한 궁금증이 있습니다.
강사님 안녕하세요. 좋은 강의 덕분에 저만의 홈페이지를 부족한 실력이지만 운영하게 되었습니다. 1년전 html이 무엇인지도 몰랐던 제가 홈페이지를 운영하게 되다니 강사님의 강의가 얼마나 훌륭한지 알수 있다고 봅니다. 감사합니다. 제 질문은 mysql 데이터베이스를 운영하면서 새로운 테이블 또는 컬럼을 추가할 때 sequelize migration을 이용해야 한다고 들어서(기존 데이터를 보존하기 위해서) 공부를 하고 있고 적용을 해보았습니다. 잘 작동하기에 문제는 없는데 mysql workbench를 이용하는게 더 직관적이고 편해서 이쪽을 이용하는 편입니다. 혹시 migration을 꼭 이용해야만 하는 장점이 있을까요? 딱히 그런게 없다면 워크벤치를 계속 이용해도 괜찮을 까요?
-
미해결mongoDB 기초부터 실무까지(feat. Node.js)
몽고디비와 mysql을 연결할 수 있을까요?
운동관련 서비스를 만들면서 사용자가 작성한 운동종목만 따로 가져와서 포스팅하려고 하는데 이를 위해서 mysql과 몽고디비를 연결해서 사용하고자 합니다. mysql에서 사용자가 작성한 운동종목 데이터만 몽고디비로 가져올 수 있을까요? sequelize와 mongoose를 사용하여, 또는 두 개의 디비를 connection하는 방법이 궁금합니다.
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
Sequelize raw query store procedure 질문입니다.
안녕하세요 강의 잘 수강하고 있습니다! sequelize raw query로 db 에 미리 작성했던 store procedure 을 호출은 불가능한가요? 구글링, 공식문서에도 찾아봤는데 안나와서 이렇게 질문드립니다! 또한 추가로 raw query 사용을 const [results, metadata] = await sequelize.query("call myTest()"); 위와 같이 작성하였더니 에러로 TypeError: Cannot read property 'query' of undefined 이런식의 에러가 발생하는데 따로 import를 { sequelize } 말고 해주어야 하나요?
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
multer를 이용한 이미지 업로드 req.body.url 오류..
multer 수업을 수강한뒤 이미지 업로드를 위해 수업 실습처럼 이미지를 먼저 서버에 전송하여 압축한 뒤 이후에 저는 게시물이 아닌 동아리 정보 등록 폼으로 작성을 하려고 합니다. 실습과 같이 /img 라우터로 res.json을 이용해 url까지 전송하였습니다. 그 후 폼 제출 버튼을 클릭해서 콘솔로 req.body.url을 확인해보면 undefined 라고 나옵니다.. 저는 왜 req.body.url에 정보가 없는건가요??
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
시퀄라이즈로 오라클연동은 안되나요?
안녕하세요 강의에서는 마이에스큐엘기반이라 저는 기존에사용하는 디비가 오라클이라라 그냥 오라클 oracledb써서 직접쿼리입력해서 하는 방식으로 했습니다다 시퀄라이즈는 오라클지원이안되나요? 또 기존에 이미 구현되어있는시스템을 노드로 전환하고있는데 이런경우에는 어떤게효율적일지 조언가능할까요??
-
미해결Node.js에 TypeScript 적용하기(feat. NodeBird)
sequelize 질문입니다
항상 좋은 수업 감사합니다!! js기반 sequelize products와 Memo 1:n관계 설정해주고 이런식으로 가져왔습니다. await models.Products.findOne({ where : { id : req.params.id }, include :[ 'Memo' ] }); 근데 여기수업 그리고 공식API 문서보니까 getProjects이런식으로 1:n관계 데이터 가져오는 거 같아서 getXXX 이게 1:n 관계 가져올 때의 쿼리가 맞는지 궁금합니다.
-
미해결Vue로 Nodebird SNS 만들기
도커에서 sequelize 연결
goorm IDE 를 이용중인 수강생 입니다. IDE 에는 mysql 이 깔려있고 현재 접속이 잘 되는 상태입니다. ('mysql -u root -p' 로 정상적인 접속 가능) 하지만 백엔드를 실행시킬때마다 자꾸 오류가 사진과 같이 뜹니다.. app.js 는 강의와 똑같이 하였습니다. stack over flow 에선 저와같은 문제점이 있었는데 답변이 없어서 해결을 도저히 못하겠습니다..
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
시퀄라이즈 환경변수 설정
안녕하세요! 기존에 npx sequelize db:create를 하고, node_env를 따로 설정하지 않으면 development가 기본값으로 설정되고 npx sequelize db:create —env test하면 config.json의 test 디비로 설정이 된다고 이해했는데 (--env 옵션이 데이터베이스를 선택할 수 있는 옵션이 맞나요??) 환경변수를 --env를 사용해 test로 바꾸면 다시 development를 사용하고 싶을땐 어떻게 바꿔주어야하나요? (이미 db:create를 했다면 npx sequelize —env test 만 써도 되는 것인가요??)
-
미해결Vue로 Nodebird SNS 만들기
mysql 과 gcp sql 연결
강의와 관련있는 질문을 남겨주세요.• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등) 질문 전달에도 요령이 필요합니다.• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. • 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요! 구체적인 질문일수록 명확한 답을 받을 수 있어요.• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다. 기본적인 예의를 지켜주세요.• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. • 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. • 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 군대에서 수업을 듣기 때문에 온라인IDE 를 이용 중인 수강생입니다. 따라서 mysql 을 localhost 에 연결하는 것이 문제가 있는데요.. GCP sql 중 mysql 에 값싼 인스턴스를 만들고 연결을 하려고 합니다 제 생각에는 config.json 에 username:root / password:인스턴스 비밀번호 / database:데이터베이스이름 / host:공개 IP / dialect:mysql 을 하면 연결될 것이라고 생각 하였는데 뜻대로 되지를 않네요.. 어떻게 하면 좋을까요 ㅠㅠ