英文:
Slug Data from Api call not displaying in window with reactjs
问题
以下是您要翻译的内容:
"I'm pretty sure I did everything right in this code below but I have no idea why the data in the clientside won't display. When I try to console the result in the UseEffect hook but and I get all data but using them in the html just doesn't work.
What worries me more is that this code worked fine for a short time before it totally stopped displaying these details in the html"
请注意,代码部分已经排除在外,这是内容的翻译部分。
英文:
I'm pretty sure I did everything right in this code below but I have no idea why the data in the clientside won't display. When I try to console the result in the UseEffect hook but and I get all data but using them in the html just doesn't work.
What worries me more is that this code worked fine for a short time before it totally stopped displaying these details in the html
import React, {
useContext,
useEffect,
useReducer,
useRef,
useState,
} from 'react';
import { Link, useParams } from 'react-router-dom';
import axios from 'axios';
import { API_URL, getError } from '../utils';
import { Store } from '../Store';
import { toast } from 'react-toastify';
import moment from 'moment';
import MessageBox from './MessageBox';
import { Button } from 'react-bootstrap';
import LoadingBox from './LoadingBox';
const reducer = (state, action) => {
switch (action.type) {
case 'FETCH_REQUEST':
return { ...state, loading: true };
case 'FETCH_SUCCESS':
return { ...state, blog: action.payload, loading: false };
case 'FETCH_FAIL':
return { ...state, loading: false, error: action.payload };
default:
return state;
}
};
export default function BlogpostScreen() {
let reviewsRef = useRef();
const [comment, setComment] = useState('');
const params = useParams();
const { slug } = params;
const [{ loading, error, blog }, dispatch] = useReducer(
reducer,
{
blog: {},
loading: true,
error: '',
}
);
useEffect(() => {
const fetchData = async () => {
dispatch({ type: 'FETCH_REQUEST' });
try {
const result = await axios.get(`${API_URL}/api/blogs/slug/${slug}`);
dispatch({ type: 'FETCH_SUCCESS', payload: result.data });
} catch (err) {
dispatch({ type: 'FETCH_FAIL', payload: getError(err.message) });
}
};
fetchData();
}, [slug]);
const { state } = useContext(Store);
const { userInfo } = state;
return (
<div className="position-relative mb-3">
<img
className="img-fluid w-100"
src={blog.image}
alt={blog.name}
style={{ objectFit: 'cover' }}
/>
<div className="bg-white border border-top-0 p-4">
<div className="mb-3">
<Link
className="badge badge-primary text-uppercase font-weight-semi-bold p-2 mr-2"
to={{
pathname: '/search',
search: `category=${blog.category}`,
}}
>
{blog.category}
</Link>
<a className="text-body" href="/">
{moment(blog.createdAt).format('MMMM Do YYYY, h:mm:ss a')}
</a>
</div>
<h1 className="mb-3 text-secondary text-uppercase font-weight-bold">
{blog.name}
</h1>
<div dangerouslySetInnerHTML={{ __html: blog.post }}></div>
</div>
<div className="d-flex justify-content-between bg-white border border-top-0 p-4">
<div className="d-flex align-items-center">
<img
className="rounded-circle mr-2"
src="img/user.jpg"
width="25"
height="25"
alt=""
/>
<span>KimmoTech</span>
</div>
<div className="d-flex align-items-center">
<span className="ml-3">
<i className="far fa-eye mr-2"></i>
{blog.views}
</span>
<span className="ml-3">
<i className="far fa-comment mr-2"></i>
{blog.numReviews}
</span>
</div>
</div>
</div>
);
}
In the backend, I had this:
blogRouter.get('/slug/:slug', async (req, res) => {
const blog = await Blog.findOneAndUpdate(
{ slug: req.params.slug },
{ $inc: { views: 1 } },
{ new: true }
);
if (blog) {
res.send({blog});
} else {
res.status(404).sendStatus({ message: 'Blogpost Not Found' });
}
});
答案1
得分: 0
我意识到问题是因为我向前端发送了这样的对象res.send({blog});
。所以我将
原来的代码修改为:
blogRouter.get('/slug/:slug', async (req, res) => {
const blog = await Blog.findOneAndUpdate(
{ slug: req.params.slug },
{ $inc: { views: 1 } },
{ new: true }
);
if (blog) {
res.send(blog);
} else {
res.status(404).sendStatus({ message: 'Blogpost Not Found' });
}
});
英文:
I realized the issue was because I was sending an object like this res.send({blog});
to the frontend. So I changed
this:
blogRouter.get('/slug/:slug', async (req, res) => {
const blog = await Blog.findOneAndUpdate(
{ slug: req.params.slug },
{ $inc: { views: 1 } },
{ new: true }
);
if (blog) {
res.send({blog});
} else {
res.status(404).sendStatus({ message: 'Blogpost Not Found' });
}
});
to this:
blogRouter.get('/slug/:slug', async (req, res) => {
const blog = await Blog.findOneAndUpdate(
{ slug: req.params.slug },
{ $inc: { views: 1 } },
{ new: true }
);
if (blog) {
res.send(blog);
} else {
res.status(404).sendStatus({ message: 'Blogpost Not Found' });
}
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论