刷新后数据未定义
Data undefined after refresh
我的 React 和 express/mongodb 应用程序存在问题,其中第一个加载 miscData
未定义(这是 mongodb 中 collection 的名称数据库),但是当我注释掉所有段落标签并且只有 console.log(getBasic)
我能够记录它(之前由于它未定义我无法记录它)然后当我取消注释段落标签时我是现在可以看到它们,直到我刷新重置它。
我有一个 console.log 语句,然后是显示博客标题的 3 html 个段落。当我第一次启动时它不起作用,直到我执行上面提到的评论保存,取消评论保存,刷新方法。
这里有 1 分钟 video 说明我在说什么,如果这没有多大意义的话。
App.js:
function App() {
const [getBasic, setGetBasic] = useState()
async function fetchData() {
await axios.get('http://localhost:3001/api')
.then(result => setGetBasic(result.data))
}
useEffect(() => {
fetchData()
}, [])
return (
<div className="App">
<p>{JSON.stringify(getBasic.miscData[1].blogTitle)}</p>
<p>{JSON.stringify(getBasic.miscData[2].blogTitle)}</p>
<p>{JSON.stringify(getBasic.miscData[3].blogTitle)}</p>
{console.log(`getBasic ${JSON.stringify(getBasic)}`)}
</div>
);
}
export default App;
server.js:
app.get('/api', (req, res) => {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept'
);
db.collection('miscData').find().toArray((err, result) => {
if (err) return console.log(err)
res.send({ miscData: result })
})
})
这是 miscData
的样子:
getBasic {"miscData":[{"_id":"62604421b57b621bda4171c7","blogTitle":"Different title","blogBody":"lorem ipsum etc etc etc"},{"_id":"626058bb61967575695bdade","blogTitle":"Com squadron","blogBody":"asidjaoisdoasodjiaosjdoia"},{"_id":"626059f961967575695bdadf","blogTitle":"test","blogBody":"test"},{"_id":"62605a3d36e02b8581f56154","blogTitle":"asdasda","blogBody":"adadada"},{"_id":"62608bc60bd6de526fd1b0bc","blogTitle":"new title","blogBody":"new body"}]}
我的React是3000端口,服务器是3001
实际上方法fetchData()
是一个异步调用,即异步是指两个或多个不存在或同时发生的对象或事件(或多个相关的事情发生而无需等待前一个一个完成)link.
虽然 <p>
标签是同步代码,但它们甚至在您的数据从后端获取之前就已呈现。因此,您会在一段时间内收到 undefined,一旦它被获取,<p>
标签就会被填充,您可以看到它们。这也解释了为什么它会在您刷新时重置。
我的 React 和 express/mongodb 应用程序存在问题,其中第一个加载 miscData
未定义(这是 mongodb 中 collection 的名称数据库),但是当我注释掉所有段落标签并且只有 console.log(getBasic)
我能够记录它(之前由于它未定义我无法记录它)然后当我取消注释段落标签时我是现在可以看到它们,直到我刷新重置它。
我有一个 console.log 语句,然后是显示博客标题的 3 html 个段落。当我第一次启动时它不起作用,直到我执行上面提到的评论保存,取消评论保存,刷新方法。
这里有 1 分钟 video 说明我在说什么,如果这没有多大意义的话。
App.js:
function App() {
const [getBasic, setGetBasic] = useState()
async function fetchData() {
await axios.get('http://localhost:3001/api')
.then(result => setGetBasic(result.data))
}
useEffect(() => {
fetchData()
}, [])
return (
<div className="App">
<p>{JSON.stringify(getBasic.miscData[1].blogTitle)}</p>
<p>{JSON.stringify(getBasic.miscData[2].blogTitle)}</p>
<p>{JSON.stringify(getBasic.miscData[3].blogTitle)}</p>
{console.log(`getBasic ${JSON.stringify(getBasic)}`)}
</div>
);
}
export default App;
server.js:
app.get('/api', (req, res) => {
res.header('Access-Control-Allow-Origin', 'http://localhost:3000');
res.header(
'Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept'
);
db.collection('miscData').find().toArray((err, result) => {
if (err) return console.log(err)
res.send({ miscData: result })
})
})
这是 miscData
的样子:
getBasic {"miscData":[{"_id":"62604421b57b621bda4171c7","blogTitle":"Different title","blogBody":"lorem ipsum etc etc etc"},{"_id":"626058bb61967575695bdade","blogTitle":"Com squadron","blogBody":"asidjaoisdoasodjiaosjdoia"},{"_id":"626059f961967575695bdadf","blogTitle":"test","blogBody":"test"},{"_id":"62605a3d36e02b8581f56154","blogTitle":"asdasda","blogBody":"adadada"},{"_id":"62608bc60bd6de526fd1b0bc","blogTitle":"new title","blogBody":"new body"}]}
我的React是3000端口,服务器是3001
实际上方法fetchData()
是一个异步调用,即异步是指两个或多个不存在或同时发生的对象或事件(或多个相关的事情发生而无需等待前一个一个完成)link.
虽然 <p>
标签是同步代码,但它们甚至在您的数据从后端获取之前就已呈现。因此,您会在一段时间内收到 undefined,一旦它被获取,<p>
标签就会被填充,您可以看到它们。这也解释了为什么它会在您刷新时重置。