上一篇提到如何從前端將資料傳給後端資料庫,所以這篇就來處理要怎麼從後端存取文章資料到前端~
GET
method在 server/index.js
新增使用 GET
的 api,內容大致與之前的 POST
相同,除了 HTTP 請求改為 get 之外,也用到了 Mongoose 的 query 方法 → Model.find()
,它會回傳所有 Post 資料庫中的文件
app.get('/api/v1/posts', async (req, res) => {
try {
const post = await Post.find();
res.status(200).json({
status: 'success',
data: {
data: post,
},
});
} catch (err) {
console.log(err);
res.json({
status: 'error',
});
}
});
在 src/api/index.js
中新增 getAllPost
方法,並使用 axios.get()
來串接 api,並回傳結果的 data 值 (res.data
)
export const getAllPost = async () => {
try {
const res = await axios.get(`${baseUrl}api/v1/posts`);
return res.data;
} catch (err) {
console.log(err.response);
alert('讀取文章失敗 (|||゚д゚)');
}
};
接著在 src/pages/Home.js
中引入 useEffect
及 getAllPost
,並在第一次渲染頁面時呼叫 getAllPost
api :
useEffect
中不可使用 async/await ,所以將 getAllPost
包成另一個函數 → fetchAllPost()
useState
建立新的狀態變數 posts
,用來儲存 api 回傳的資料import React, { useState, useEffect } from 'react';
import { getAllPost } from '../api';
const [posts, setPosts] = useState([]);
useEffect(() => {
fetchAllPost();
}, []);
const fetchAllPost = async () => {
const res = await getAllPost();
setPosts(res.data.data);
};
然後將狀態變數 posts
以參數 data
傳給 <Post />
元件
<Post data={posts} />
(目前 Home.js
的程式碼)
<Post />
元件原本在 src/components/Post.js
中,我們使用 Redux 的 useSelector
來讀取網站的全域變數,而現在我們現在有了後端資料庫,也就不用再從全域變數讀取資料了,那該怎麼使用從 Home.js
傳進來的 data
參數呢?
在這個例子中,<Post />
是子元件,接受一個「props」(屬性 properties)物件並回傳一個 React element,子元件可以透過 props 來取得父元件 <Home />
傳入的 data:
// 方法一
export default function Post(props) {
// const data = props.data;
const { data } = props;
}
// 方法二
export default function Post({data}) {
}
目前程式碼
備註: <Link />
的 to
將 id
→ _id
、el.created_at
→ el.createdAt
(依照後端定義的名稱)
這樣就可以在首頁顯示從後端 api 取得的所有文章啦~