【问题标题】:SSR API cookies set/deleteSSR API cookie 设置/删除
【发布时间】:2020-02-17 06:33:30
【问题描述】:

我可以在 getInitialProps 中使用 ssr 传递 cookie

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' })
}

【问题讨论】:

    标签: next.js


    【解决方案1】:

    好的,这似乎可行:

    如果获取请求是由服务器发出的,那么我们将“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)
          })
      })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 2013-02-21
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多