SSR API cookies set/delete
SSR API cookies set/delete
我可以在 getInitialProps 中使用
在 ssr 上传递 cookie
req?.headers?.cookie
我可以在 api 路由中读取它们,如果请求不是 ssr,我也可以使用
设置它们
res.setHeader('Set-Cookie', ...)
但是如果请求来自 API 解析器中的 getInitialProps (SSR),如何 set/delete 它们?
// Api handler
const handler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {
console.log(req.headers.cookie) // works on ssr/client
res.setHeader('Set-Cookie', ['testSSR2=2; path=/; expires=Thu, 01 Jan 2021 00:00:01 GMT;']) // works on client request only
res.json({ data: 'test' })
}
好的,这似乎有效:
如果获取请求是由服务器发出的,那么我们克隆(通过一些解析)'Set-Cookie' header 到 res header.
import fetch from 'isomorphic-unfetch'
import { IncomingMessage, ServerResponse } from 'http'
const payload = (body: any, cookies?: any): object => {
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json',
cookie: cookies || ''
}
return {
method: 'POST',
headers,
credentials: 'same-origin',
body: JSON.stringify(body)
}
}
type ApiRes<ExpectedData> = Partial<{ data: ExpectedData }>
type AnyObj = { [key: string]: any }
const fetchAPI = <Body = AnyObj, ExpectedData = AnyObj>(
apiAction: string,
body: Body,
req?: IncomingMessage,
res?: ServerResponse
): Promise<ApiRes<ExpectedData>> => {
return new Promise((resolve) => {
fetch(`mysite/api/some`, payload(body, req?.headers?.cookie))
.then((raw) => {
if (req && res) {
const setCookies = raw.headers.get('Set-Cookie')
if (setCookies !== null) {
res.setHeader('Set-Cookie', setCookies.split(';, '))
}
}
return raw.json()
})
.then((parsed: ApiRes<ExpectedData>) => resolve(parsed))
.catch((err) => {
console.log(err)
})
})
}
我可以在 getInitialProps 中使用
在 ssr 上传递 cookiereq?.headers?.cookie
我可以在 api 路由中读取它们,如果请求不是 ssr,我也可以使用
设置它们res.setHeader('Set-Cookie', ...)
但是如果请求来自 API 解析器中的 getInitialProps (SSR),如何 set/delete 它们?
// Api handler
const handler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {
console.log(req.headers.cookie) // works on ssr/client
res.setHeader('Set-Cookie', ['testSSR2=2; path=/; expires=Thu, 01 Jan 2021 00:00:01 GMT;']) // works on client request only
res.json({ data: 'test' })
}
好的,这似乎有效:
如果获取请求是由服务器发出的,那么我们克隆(通过一些解析)'Set-Cookie' header 到 res header.
import fetch from 'isomorphic-unfetch'
import { IncomingMessage, ServerResponse } from 'http'
const payload = (body: any, cookies?: any): object => {
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json',
cookie: cookies || ''
}
return {
method: 'POST',
headers,
credentials: 'same-origin',
body: JSON.stringify(body)
}
}
type ApiRes<ExpectedData> = Partial<{ data: ExpectedData }>
type AnyObj = { [key: string]: any }
const fetchAPI = <Body = AnyObj, ExpectedData = AnyObj>(
apiAction: string,
body: Body,
req?: IncomingMessage,
res?: ServerResponse
): Promise<ApiRes<ExpectedData>> => {
return new Promise((resolve) => {
fetch(`mysite/api/some`, payload(body, req?.headers?.cookie))
.then((raw) => {
if (req && res) {
const setCookies = raw.headers.get('Set-Cookie')
if (setCookies !== null) {
res.setHeader('Set-Cookie', setCookies.split(';, '))
}
}
return raw.json()
})
.then((parsed: ApiRes<ExpectedData>) => resolve(parsed))
.catch((err) => {
console.log(err)
})
})
}