게시글
질문&답변
회원 가입후 다른 기능들이 오류가 발생합니다.
와 답변 감사드립니다.ㅠㅠ 설명해주신거 꼭 기억 하겠습니다~ 감사합니다
- 0
- 2
- 226
질문&답변
회원 가입후 다른 기능들이 오류가 발생합니다.
const express = require("express"); const router = express.Router(); const bcrypt = require("bcrypt"); const passport = require("passport"); const { User, Post, Image, Comment } = require("../models"); router.post("/login", (req, res, next) => { passport.authenticate("local", (err, user, info) => { if (err) { console.error(err); //서버 에러 return next(err); } if (info) { return res.status(401).send(info.reason); } return req.login(user, async (loginErr) => { if (loginErr) { console.error(loginErr); return next(loginErr); } const fullUserWithoutPassword = await User.findOne({ where: { id: user.id }, attributes: { exclude: ["password"], }, include: [ { model: Post, }, { model: User, as: "Followings", }, { model: User, as: "Followers", }, ], }); return res.status(200).json(fullUserWithoutPassword); }); })(req, res, next); }); router.post("/", async (req, res, next) => { try { const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { return res.status(403).send("이미 사용 중인 아이디입니다."); } const hashedPassword = await bcrypt.hash(req.body.password, 12); await User.create({ email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); res.status(201).send("ok"); } catch (error) { console.error(error); next(error); // status 500 } res.send("ok"); }); router.post("/logout", (req, res) => { req.logout(); req.session.destroy(); res.send("ok"); }); module.exports = router;
- 0
- 2
- 226
질문&답변
로그인시 500 오류 발생하는데 이유를 모르겠습니다 ㅠㅠ
const express = require("express"); const { User } = require("../models"); const router = express.Router(); const bcrypt = require("bcrypt"); const passport = require("passport"); //전략실행, 미들웨어 확정 authenticate가 (req, res, next) 를 쓸수 있게 // router.post("/login", isNotLoggedIn, (req, res, next) => { router.post("/login", (req, res, next) => { passport.authenticate("local", (err, user, info) => { if (err) { console.error(err); //서버 에러 return next(err); } if (info) { //info가 있다는건 client 에러가 있다는거, 클라이언트로 응답 보내주는거 // 401: 미인증 return res.status(401).send(info.reason); } return req.login(user, async (loginErr) => { // passport/nde.js 안 serializeUsert실행 //서비스 로그인 에러가 아니라 passport로그인 에러, 잘 발생하지 않음 if (loginErr) { console.error(loginErr); return next(loginErr); } //사용자 정보를 프론트로 넘기기 return res.status(200).json(user); }); })(req, res, next); }); router.post("/", async (req, res, next) => { //POST/user/ //뒤에 숫자는 암호의 난이도 const hashedPassword = await bcrypt.hash(req.body.password, 12); //생략 됏지만 실제로는 /POST/user // await를 안쓰면 비동기가 되서 res.send()이 먼저 실행 될수 있음 try { // findOne디비 안 중복 데이터 찾는 함수_시퀄라이즈 const exUser = await User.findOne({ where: { email: req.body.email, }, }); if (exUser) { // return을 써서 라우터 종료 return res.status(403).send("이미 사용 중인 아이디입니다."); } await User.create({ email: req.body.email, nickname: req.body.nickname, password: hashedPassword, }); res.status(201).send("ok"); } catch (error) { console.error(error); next(error); // status 500 } res.send("ok"); }); module.exports = router;
- 0
- 3
- 697
질문&답변
로그인시 500 오류 발생하는데 이유를 모르겠습니다 ㅠㅠ
const express = require("express"); const postRouter = require("./routes/post"); const userRouter = require("./routes/user"); const db = require("./models"); const cors = require("cors"); const passportConfig = require("./passport"); const session = require("express-session"); const cookieParser = require("cookie-parser"); const passport = require("passport"); const dotenv = require("dotenv"); dotenv.config(); const app = express(); db.sequelize .sync() .then(() => { console.log("db연결 성공!"); }) .catch(console.error); passportConfig(); //프론트에서 넘어온 데이터를 해석해서 라우터의 양식(req body)에 넘겨준다 app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.get("/", (req, res) => { res.send("hello express"); }); app.get("/api", (req, res) => { res.send("hello express/api"); }); // get: 가져오는거 , post: 생성하다 요청 데이터 처리 메시지 바디를 통해 서버로 요청 데이터 전달, delete: 지우기, put:전체수정하다,patch:전체 수정 app.get("/api/posts", (req, res) => { res.json([ { id: 1, content: "hello" }, { id: 2, content: "hello2" }, { id: 3, content: "hello3" }, ]); }); app.use( cors({ origin: "*", credentials: false, }) ); app.use("/post", postRouter); app.use("/user", userRouter); app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( session({ saveUninitialized: false, resave: false, secret: process.env.COOKIE_SECRET, // cookie: { // httpOnly: true, // secure: false, // domain: process.env.NODE_ENV === "production" && ".nodebird.com", // }, }) ); app.use(passport.initialize()); app.use(passport.session()); app.listen(3065, () => { console.log("백엔드 서버 실행 중"); });
- 0
- 3
- 697
질문&답변
대댓글 작성시 오류 발생
import axios from "axios"; import { delay, put, takeLatest, all, fork } from "redux-saga/effects"; import { ADD_POST_REQUEST, ADD_POST_SUCCESS, ADD_POST_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_COMMENT_FAILURE, } from "../reducers/post"; function addPostAPI(data) { return axios.post("/api/post", data); } //put은 디스패치 function* addPost(action) { try { //call은 데이터 나올떄까지 대기 yield delay(1000); // const result = yield call(addPostAPI, action.data); yield put({ type: ADD_POST_SUCCESS, data: action.data, }); } catch (err) { yield put({ type: ADD_POST_FAILURE, data: err.response.data, }); } } function addCommentAPI(data) { return axios.post("/api/post/${data.postId}/comment", data); } //put은 디스패치 function* addComment(action) { try { //call은 데이터 나올떄까지 대기 yield delay(1000); // const result = yield call(addPostAPI, action.data); console.log("addComment사가"); yield put({ type: ADD_COMMENT_SUCCESS, data: action.data, }); } catch (err) { yield put({ type: ADD_COMMENT_FAILURE, data: err.response.data, }); } } function* watchAddPost() { yield takeLatest(ADD_POST_REQUEST, addPost); } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment); } export default function* postSaga() { yield all([fork(watchAddPost), fork(watchAddComment)]); }
- 0
- 4
- 470
질문&답변
대댓글 작성시 오류 발생
import shortId from "shortid"; export const initialState = { mainPosts: [ { id: 1, User: { id: 1, nickname: "제로초", }, content: "첫번째 게시글#해시테그#익스프레스", Images: [ { src: "https://bookthumb-phinf.pstatic.net/cover/137/995/13799585.jpg?update=20180726", }, { src: "https://gimg.gilbut.co.kr/book/BN001958/rn_view_BN001958.jpg", }, { src: "https://gimg.gilbut.co.kr/book/BN001998/rn_view_BN001998.jpg", }, ], Comments: [ { User: { nickname: "nero", }, content: "우와 개정판이당", }, { User: { nickname: "hero", }, content: "얼른사고 싶어요~", }, ], imagePaths: [], postAdded: false, addPostLoading: false, addPostDone: false, addPostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, }, ], }; //액션 이름을 상수로 뺌 export const ADD_POST_REQUEST = "ADD_POST_REQUEST"; export const ADD_POST_SUCCESS = "ADD_POST_SUCCESS"; export const ADD_POST_FAILURE = "ADD_POST_FAILURE"; export const ADD_COMMENT_REQUEST = "ADD_COMMENT_REQUEST"; export const ADD_COMMENT_SUCCESS = "ADD_COMMENT_SUCCESS"; export const ADD_COMMENT_FAILURE = "ADD_COMMENT_FAILURE"; const ADD_POST = "ADD_POST"; export const addPost = (data) => ({ type: ADD_POST_REQUEST, data, }); export const addComment = (data) => ({ type: ADD_COMMENT_REQUEST, data, }); const dummyPost = (data) => ({ id: shortId.generate(), content: data, User: { id: 1, nickname: "제로초", }, Images: [], Comments: [], }); const dummyComment = (data) => ({ id: shortId.generate(), content: data, User: { id: 1, nickname: "제로초", }, }); const reducer = (state = initialState, action) => { switch (action.type) { case ADD_POST_REQUEST: return { ...state, addPostLoading: true, addPostDone: false, addPostError: null, }; case ADD_POST_SUCCESS: return { ...state, // dummyPost앞에 작성해야 게시글 위에 올라감 mainPosts: [dummyPost(action.data), ...state.mainPosts], addPostLoading: false, addPostDone: true, }; case ADD_POST_FAILURE: return { ...state, addPostLoading: false, addPostError: action.error, }; case ADD_COMMENT_REQUEST: const postIndex = state.mainPosts.findIndex( (v) => v.id === action.data.postId ); const post = { ...state.mainPosts[postIndex] }; post.Comments = [dummyComment(action.data.content), ...post.Comments]; const mainPosts = [...state.mainPosts]; mainPosts[postIndex] = post; return { ...state, mainPosts, addCommentLoading: false, addCommentDone: true, }; case ADD_COMMENT_SUCCESS: return { ...state, // dummyPost앞에 작성해야 게시글 위에 올라감 mainPosts: [dummyPost, ...state.mainPosts], addCommentLoading: false, addCommentDone: true, }; case ADD_COMMENT_FAILURE: return { ...state, addCommentLoading: false, addCommentError: action.error, }; default: return state; } }; export default reducer;
- 0
- 4
- 470
질문&답변
대댓글 작성시 오류 발생
import React, { useState, useCallback } from "react"; import PropTypes from "prop-types"; import { useSelector, useDispatch } from "react-redux"; import { Card, Popover, Button, Avatar, List, Comment } from "antd"; import { RetweetOutlined, HeartOutlined, MessageOutlined, EllipsisOutlined, HeartTwoTone, ConsoleSqlOutlined, } from "@ant-design/icons"; import Link from "next/link"; import moment from "moment"; import CommentForm from "./CommentForm"; import PostImages from "./PostImages"; import PostCardContent from "./PostCardContent"; const PostCard = ({ post }) => { console.log("포스트카드"); console.log(post); const [Liked, setLiked] = useState(false); const [commentFormOpened, setCommentFormOpened] = useState(false); const onToggleLike = useCallback(() => { // prev는 자동으로 이전 데이터가 들어가 있음. true는 false로 false는 true로 setLiked((prev) => !prev); }, []); const onToggleComment = useCallback(() => { // true는 false로 false는 true로 setCommentFormOpened((prev) => !prev); }, []); // const { id } = useSelector((state) => state.user.me && state.user.me.id); // 같은 문장인데 줄어 든거임. const id = useSelector((state) => state.user.me?.id); return ( cover={post.Images[0] && } // 배열 안에 jsx를 넣어줄거면 key를 넣어 줘야 한다. actions={[ , Liked ? ( twoToneColor="#eb2f96" key="heart" onClick={onToggleLike} /> ) : ( ), , key="more" content={ {/* 로그린 했고 작성자 아이디랑 내아이디랑 같으면 수정 가능 */} {id && post.User.id === id ? ( 수정 삭제 ) : ( 신고 )} } > , ]} > // 유저 닉네임의 첫번째 글자 avatar={{post.User.nickname[0]}} title={post.User.nickname} description={} /> {commentFormOpened && ( header={`${post.Comments.length}개의 댓글`} itemLayout="horizontal" dataSource={post.Comments} // post.comments의 세부 항목이 item으로 들어감 renderItem={(item) => ( author={item.User.nickname} avatar={{item.User.nickname[0]}} content={item.content} /> )} /> )} {/* */} ); }; PostCard.propTypes = { // PropTypes.object이렇게 할 수 있는데 더 구체적으로 적어 줄수 있다. post: PropTypes.shape({ id: PropTypes.number, User: PropTypes.object, content: PropTypes.string, createdAt: PropTypes.object, Comments: PropTypes.arrayOf(PropTypes.object), Images: PropTypes.arrayOf(PropTypes.string), }).isRequired, }; export default PostCard;
- 0
- 4
- 470