next.js - 带有 getInitialProps 和 getStaticProps 的页面
问题描述
我有一个页面,我需要使用 axios 获取包含凭据的数据,并根据 url 中的参数使用上一个请求中的数据发出另一个请求。
我不知道如何解决这个问题,因为我可以在页面getInitialProps
和getStaticProps
组件中使用它们,而在组件中我根本无法使用它们。
下面的代码有效,但我不知道如何分解它,以便在服务器端完成登录,以便我仍然可以从 URL 获取参数。
function Result({surveyId, responseId, sessionKey}) {
return (
<>
<div>surveyId: {surveyId}</div>
<div>responseId: {responseId}</div>
<div>sessionKey: {sessionKey}</div>
</>
)
}
Result.getInitialProps = async ({ query }) => {
// Example of URL
// http://localhost:3000/result?surveyId=12345&responseId=6
const surveyId = query.surveyId
const responseId = query.responseId
const data = { method: 'get_session_key', params: ['admin', 'password'], id: 1 }
const options = {
headers: {
'connection': 'keep-alive',
'content-type': 'application/json'
}
}
const sessionKey = await axios.post(url, data, options).then(
(response) => {
return response.data.result
},
(error) => {
console.log(error)
}
)
return {
surveyId: surveyId,
responseId: responseId,
sessionKey: sessionKey,
}
}
解决方案
getStaticProps
,getInitialProps
或者getServerSideProps
,它们都只在页面中执行。因为客户端向页面发出请求,所以在幕后,next.js 设置路由的方式,每当请求到达路由时,next.js 首先检查该页面是否具有这些功能,以及是否具有它首先运行这些函数,将结果作为 props 获取,然后运行组件函数并将 props 传递给组件。
getsStaticProps
用于静态文件生成。一个很好的例子是生成博客。运行时npm run build
,下一个 js 将运行所有 api 调用并用博客填充页面。所以实际上,如果您检查构建文件夹,在getStaticPath
执行的页面的 html 文件中,所有数据都已经在该 html 文件中。数据将被服务器缓存,因此当用户向那些静态生成的文件发出请求时,数据将立即被提供。所以你不应该在 getStaticProps 中运行登录过程,因为登录是一个动态过程。
所有这些功能都用于预渲染以实现更好的 SEO 优化。但是,如果您想加载特定于用户的数据,则不需要为 seo 目的预先呈现特定于用户的数据。你也可以做客户端。
或者您可以使用 next.js api 函数,您将在 api 目录中编写函数,然后从 getServerSideProps 向 api 路由发送请求。这样,如果您需要在不同的页面中运行相同的代码,而不是编写相同的代码进行身份验证,您将请求 api 函数,它会为您处理。
推荐阅读
- reactjs - 如何在 ReactJS 中将模板文字转换为 html?
- c - 在 C 代码的后面部分丢弃 volatile 限定符
- python - 编码参数是否适用于 pandas.read_excel?
- node.js - 如何在 MongoDB 模式中使用数组类型(使用 Mongoose),使得数组由另一个表的 _id 组成
- ios - React Native iOS - 如何将配置文件添加到提交到 Appstore 的 ipa
- node.js - Discord.js 删除 X 消息
- python - 带有外部连接 SQL SERVER 的 Django 2.2
- python - Discord.py:如何修复“事件循环已关闭”
- asp.net-core - ASP Net Core 获取路由值
- python - python 控制台是否有任何时间限制,因为我的连续循环在几个小时后停止?