acm*_*une 4 javascript express next.js apollo-client
我正在构建一个NextJS应用程序,并且正在尝试访问 a,cookie以便我可以使用它来设置 a Http Headerfor GraphQL Request,我正在使用apollo-link-context. 这是创建的代码ApolloClient
function createApolloClient(initialState = {}) {
const httpLink = new HttpLink({ uri: `${baseUrl}/graphql`, credentials: 'same-origin', fetch })
const authLink = setContext((_, prevCtx) => {
let token = ''
if (typeof window === 'undefined') token = getCookieFromServer(authCookieName, REQ)
else token = getCookieFromBrowser(authCookieName)
return ({ headers: { 'Auth-Token': token } })
})
const client = new ApolloClient({
ssrMode: typeof window === 'undefined',
cache: new InMemoryCache().restore(initialState),
link: authLink.concat(httpLink)
})
return client
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是该getCookieFromServer函数需要 anExpress Request作为第二个参数,因此它可以从 中提取 cookie req.headers.cookie,但我不知道可以从哪里获取它。
我终于找到办法了。每当我从服务器(在 )发送请求时PageComponent.getInitialProps,我都会在上下文中设置标头,然后我可以从以下位置访问它setContext:
PageComponent.getInitialProps = async (ctx) => {
...
const token = getCookieFromServer(authCookieName, ctx.req)
const { data } = await client.query({
query,
context: { headers: { 'Auth-Token': token } }
})
...
}
Run Code Online (Sandbox Code Playgroud)
然后在setContext中:
const authLink = setContext((_, prevCtx) => {
let headers = prevCtx.headers || {}
if (!headers['Auth-Token']) {
const token = getCookieFromBrowser(authCookieName)
headers = { ...headers, 'Auth-Token': token }
}
return ({ headers })
})
Run Code Online (Sandbox Code Playgroud)
因此,如果标头已经存在于先前的上下文中(从服务器发送时就是这种情况),则只需使用它即可。如果不存在(从浏览器发送时),请从浏览器获取 cookie 并设置它。
我希望有一天它会对某人有所帮助。
| 归档时间: |
|
| 查看次数: |
465 次 |
| 最近记录: |