https://www.inflearn.com/questions/33218
다시 새롭게 질문드립니다,. 프론트상의 요청주소를
"localhost:3060/post/100000(그룹id)" 로 하려고 전반적으로 수정하였고
부모자식관계가 있는 댓글부분을 참고해서 < routes / back>, < sagas / front > 거의 똑같이 만들었어요
"(게시물(Post)의 부모가되는) GpostId 를 찾아서 게시물들 불러오기" 를 하고싶어서 아래와같이 코드를 작성했는데
posts/ undefined 가 뜹니다. saga 에서 loadMainPostsApi 에서 변수 gpostId를 제대로 정의하지못하는것같습니다..
******
댓글올리기 사이클이랑 거의 동일하게 해주었는데 ( 초록색빗금표시를 한부분의 코드 )
게시물불러오기가 안되는 이유가 뭘까요ㅠ??
******
< posts.js/ routes / back >
// 게시물'들' 불러오기
router.get('/:id', async (req, res, next) => { // GET /api/posts/100/개발자
try {
const gpost = await db.Gpost.findOne({ where: { id: req.params.id } });
if (!gpost) {
return res.status(404).send('포스트가 존재하지 않습니다.!!!!'); ///////////////////////////
}//////////////////////////////////////////////////////////////////////////////////////////
const posts = await db.Post.findAll({
where: {
GpostId: req.params.id,
},
include: [{
model: db.User,
attributes: ['id', 'nickname'],
},{
model: db.Image,
},{
model: db.User,
through: 'Like',
as:'Likers',
attributes:['id'],
}],
order: [['createdAt', 'DESC']], // DESC는 내림차순, ASC는 오름차순
});
res.json(posts);
} catch (e) {
console.error(e);
next(e);
}
});
< post.js/ routes / back >
// 게시물 올리기 route : http://localhost:3060/post/개발자
router.post('/:id', isLoggedIn, upload.none(), async (req, res, next) => {
try {
// 부모가되는 그룹포스트가있는지 /////////////////////////////////////////////
const gpost = await db.Gpost.findOne({ where: { id: req.params.id } });
if (!gpost) {
return res.status(404).send('포스트가 존재하지 않습니다.????');
}
///////////////////////////////////////////////////////////////////////////
const newPost = await db.Post.create({
content: req.body.content,
UserId: req.user.id,
GpostId: gpost.id, // 어떤 그룹에 속해있는지
});
await gpost.addPost(newPost.id);
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
if (req.body.image) { // 이미지 주소를 여러개 올리면 image: [주소1, 주소2]
if (Array.isArray(req.body.image)) {
const images = await Promise.all(req.body.image.map((image) => {
return db.Image.create({ src: image });
}));
await newPost.addImages(images);
} else { // 이미지를 하나만 올리면 image: 주소1
const image = await db.Image.create({ src: req.body.image });
await newPost.addImage(image);
}
}
const fullPost = await db.Post.findOne({
where: { id: newPost.id },
include: [{
model: db.User,
attributes: ['id', 'nickname'],
},{
model: db.Image,
},{
model:db.User,
as:"Likers",
attributes:['id'],
}],
});
res.json(fullPost);
} catch (e) {
console.error(e);
next(e);
}
});
<<<<<<<<<<<<<<<<<< post.js/ sagas / front >>>>>>>>>>>>>>>>>>>>
// 게시물 올리기
function addPostAPI(postData){ // http://localhost:3060/post/10000 /////////////////////
return axios.post(`/post/${postData.gpostId}`, { content: postData.content },{
withCredentials: true //////////////////////////////////////////////////////////
}); ////////////////////////////////////////////////////////////////////////////////
}
function* addPost(action) {
try {
const result = yield call(addPostAPI, action.data);
yield put({
type: ADD_POST_SUCCESS,
data: { ////////////////////////////////////////////////////////////////
gpostId: action.data.gpostId,
content: result.data,
},//////////////////////////////////////////////////////////////////////
});
console.error(e);
} catch (e) {
yield put({
type: ADD_POST_FAILURE,
error: e,
});
}
}
function* watchAddPost(){
yield takeLatest(ADD_POST_REQUEST, addPost);
}
// 게시물 로드하기
function loadMainPostsAPI(gpostId) { // http://localhost:3060/post/10000
return axios.get(`/posts/${gpostId}`); //////////////////////////////////////////
} ///////////////////////////////////////////////////////////////////////////////////
function* loadMainPosts(action) {
try {
const result = yield call(loadMainPostsAPI, action.data);
yield put({
type: LOAD_MAIN_POSTS_SUCCESS,
data: {
gpostId: action.data,
content: result.data,
},
});
} catch (e) {
yield put({
type: LOAD_MAIN_POSTS_FAILURE,
error: e,
});
}
}
function* watchLoadMainPosts() {
yield takeLatest(LOAD_MAIN_POSTS_REQUEST, loadMainPosts);
}
< server.js / front>
server.get('/post/:id', (req, res) => { // http://localhost:3060/post/1000000
return app.render(req, res, '/posted', { id: req.params.id });
});
< posted.js / pages / front > - server.js 에서 연결해주는 동적페이지
// 그룹: 동적페이지
const Posted = () => {
.
.
.
return (
<>
<div className="wrap">
{/* GpostId와 그룹의 id가 같을경우에만 화면에 표시 */}
{GroupPosts.map((val)=>{
var gid = window.location.href.split("/").reverse()[0];
if( gid == val.id){
return(
<div>
<GroupBox gpost={val} gimg={val.GImgs} /><UploadForm gpost={val} />
</div>
);
}
})}
</div>
</>
);
};
Posted.getInitialProps = async (context) => {
console.log('posted getInitialProps', context.query.title);
};
export default Posted;
< UploadForm.js / Component / front > - 게시물올리는 컴포넌트 onSubmitForm 함수부분
const onSubmitForm = useCallback((e) => {
e.preventDefault();
if (!text || !text.trim()) {
return alert('게시글을 작성하세요.');
}
const formData = new FormData();
imagePaths.forEach((i) => {
formData.append('image', i);
});
formData.append('content', text); ////////////////////////////////////////////////////
formData.append('GpostId', gpost.id); //////////////////// <- //////////////////////////
dispatch({ ////////////////////////////////////////////////////
type: ADD_POST_REQUEST,
data: formData,
});
}, [text, imagePaths, gpost.id]);
< post.js /reducers / front >
// 게시물 불러오기
case LOAD_MAIN_POSTS_REQUEST: {
return {
...state,
mainPosts: [],
};
}
case LOAD_MAIN_POSTS_SUCCESS: {
return {
...state,
mainPosts: action.data,
};
}
case LOAD_MAIN_POSTS_FAILURE: {
return {
...state,
};
}
< WorkBench > - GpostId 의 파란색부분은 워크벤치에서 임의로 넣어주었습니다.
+ 노드 백서버 오류메세지입니다