如何在 API 路由和 getServerSideProps 之间共享数据?
How to share data between API route and getServerSideProps?
假设需要从外部 API 获取非客户端特定数据 x
。为了减少加载时间,我想获取 x
一次,将其缓存并仅在以下情况下再次获取:
- 客户请求需要
x
和
- 我
x
的缓存数据早于 ttl
秒。
我如何才能通过 API 路由和 getServerSideProps
访问 x
的缓存数据?
我的方法
x
作为静态 class 属性
我用静态方法 getX
创建了一个 class Provider
,它将
- 获取
x
并将其保存为 Provider.x
如果 Provider.x
未定义或者之前的获取时间超过 ttl
秒然后
- return
Provider.x
.
这不起作用,因为 getServerSideProps
中的 Provider.x
和 API 路由中的 Provider.x
不指向内存中的同一个对象。我想这是由于他们 运行 在个体工人中造成的。
正在将 x
保存到文件
类似于第一种方法,除了将 x
保存到本地文件而不是静态文件 属性。这确实有效,但速度很慢,因为它必须在硬盘上而不是在内存中读写。
您可以使用 Node.js global
对象在 API 路由和 getServerSideProps
之间共享数据。
例如,您可以在 getServerSideProps
函数中设置数据。
export const getServerSideProps = async () => {
// Set data in `global` object
global._SOME_DATA_ = { data: { hello: 'world' }, ttl: '3600' }
// ...
}
然后在 API 路线的稍后位置检索相同的数据。
export default async (req, res) => {
console.log(global._SOME_DATA_) // Logs: `{ data: { hello: 'world' }, ttl: '3600' }`
// ...
}
假设需要从外部 API 获取非客户端特定数据 x
。为了减少加载时间,我想获取 x
一次,将其缓存并仅在以下情况下再次获取:
- 客户请求需要
x
和 - 我
x
的缓存数据早于ttl
秒。
我如何才能通过 API 路由和 getServerSideProps
访问 x
的缓存数据?
我的方法
x
作为静态 class 属性
我用静态方法 getX
创建了一个 class Provider
,它将
- 获取
x
并将其保存为Provider.x
如果Provider.x
未定义或者之前的获取时间超过ttl
秒然后 - return
Provider.x
.
这不起作用,因为 getServerSideProps
中的 Provider.x
和 API 路由中的 Provider.x
不指向内存中的同一个对象。我想这是由于他们 运行 在个体工人中造成的。
正在将 x
保存到文件
类似于第一种方法,除了将 x
保存到本地文件而不是静态文件 属性。这确实有效,但速度很慢,因为它必须在硬盘上而不是在内存中读写。
您可以使用 Node.js global
对象在 API 路由和 getServerSideProps
之间共享数据。
例如,您可以在 getServerSideProps
函数中设置数据。
export const getServerSideProps = async () => {
// Set data in `global` object
global._SOME_DATA_ = { data: { hello: 'world' }, ttl: '3600' }
// ...
}
然后在 API 路线的稍后位置检索相同的数据。
export default async (req, res) => {
console.log(global._SOME_DATA_) // Logs: `{ data: { hello: 'world' }, ttl: '3600' }`
// ...
}