Next.js SSR API cookies设置/删除

Next.js SSR API cookies设置/删除,next.js,Next.js,我可以使用 req?.headers?.cookie 我可以在api路由中读取它们,如果请求不是使用ssr,我也可以设置它们 res.setHeader('Set-Cookie',…) 但如果请求来自API解析器中的getInitialProps(SSR),如何设置/删除它们 // Api handler const handler = async (req: NextApiRequest, res: NextApiResponse): Promise<void> => {

我可以使用

req?.headers?.cookie
我可以在api路由中读取它们,如果请求不是使用ssr,我也可以设置它们

res.setHeader('Set-Cookie',…)

但如果请求来自API解析器中的getInitialProps(SSR),如何设置/删除它们

// 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' })
}
//Api处理程序
const handler=async(req:NextApiRequest,res:nextapireresponse):Promise=>{
console.log(req.headers.cookie)//在ssr/客户端上工作
res.setHeader('Set-Cookie',['testSSR2=2;path=/;expires=Thu,2021年1月1日00:00:01 GMT;'])//仅适用于客户端请求
res.json({data:'test'})
}

好的,这似乎有效:

若服务器发出了获取请求,那个么我们(通过一些解析)将“Set Cookie”头克隆为res头

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)
      })
  })
}
import-fetch from'isomorphic unfetch'
从“http”导入{IncomingMessage,ServerResponse}
常量有效负载=(主体:任何,cookies?:任何):对象=>{
常量头={
接受:'application/json',
“内容类型”:“应用程序/json”,
饼干:饼干
}
返回{
方法:“POST”,
标题,
凭据:“相同来源”,
body:JSON.stringify(body)
}
}
类型ApiRes=部分
键入AnyObj={[key:string]:any}
常量fetchAPI=(
动作:字符串,
身体:身体,,
请求?:输入消息,
res?:服务器响应
):承诺=>{
返回新承诺((解决)=>{
fetch(`mysite/api/some`,有效负载(body,req?.headers?.cookie))
。然后((原始)=>{
如果(请求和回复){
const setCookies=raw.headers.get('Set-Cookie')
if(setCookies!==null){
res.setHeader('Set-Cookie',setCookies.split(';,'))
}
}
返回raw.json()
})
.then((解析:ApiRes)=>resolve(解析))
.catch((错误)=>{
console.log(错误)
})
})
}