首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cookie和tRPC

Cookie和tRPC
EN

Stack Overflow用户
提问于 2022-09-11 00:51:26
回答 1查看 329关注 0票数 2

我很难理解如何使用tRPC处理cookie。

我特别困惑如何从服务器上发送cookie,然后如何从res读取cookie。我发现关于GitHub cookie的每一个SO和tRPC帖子都没有帮助。

下面是我的代码示例,您可以知道我在哪里。

如有任何澄清问题,请随时提出。

代码语言:javascript
复制
// backend/index.ts

const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.use(cors());

app.use(cookieParser())

app.use(
  "/login/v1",
  trpcExpress.createExpressMiddleware({
    router: loginRouter,
    createContext: createLoginContext
  })
);
app.listen(PORT, () => console.log(`server is running on port ${PORT}`));
代码语言:javascript
复制
// backend/router.ts

export async function createLoginContext({req,res}: trpcExpress.CreateExpressContextOptions) {
  
  return {
    req,
    res
  }
}

export type LoginContext = trpc.inferAsyncReturnType<typeof createLoginContext>

export const loginRouter = trpc.router<LoginContext>()
.mutation('testCookies', {
  async resolve({ctx, input}):Promise<any> {
    console.log(ctx.req.cookies);
    ctx.res.cookie('I set this cookie','cooookkiiieee')
    return ??
  }
});
代码语言:javascript
复制
// client/requests.ts

const createLoginRouter = () => {
    return createTRPCClient<LoginRouter>({
      url: "http://localhost:5000/login/v1",
      headers: {
         // use universal cookie to set a cookie property? 
      }

    })
}

export const testCookiesRequest = async() => {
  const client = createLoginRouter() 
  try {
    const val = await client.mutation('testCookies')
    return val
  } catch(e) {
    throw e
  }
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-22 20:25:04

佩里

不确定是否有此修复,但如果有帮助,我设法用这种方式设置了一个使用会话cookie的快捷服务器。

在您的服务器中,您需要使用这样的凭据初始化cors。

代码语言:javascript
复制
app.use(cors({credentials: true}))

然后,需要将快速会话添加到上下文中。你可以像这样组合你的上下文。这将确保进入服务器的请求具有会话和cookie。

代码语言:javascript
复制
import { CreateExpressContextOptions } from '@trpc/server/adapters/express'
import { Request } from 'express'
import session from 'express-session'

type ExpressRequest = Omit<CreateExpressContextOptions, 'req'> & {
  req: Request & { session: Session }
}

export const createContext = ({
  req,
  res,
}: ExpressRequest) => {
  return {
    req,
    res
  }
}

export type Context = inferAsyncReturnType<typeof createContext>

最后,对于应用程序中使用trpc的某些地方,请将凭据设置为include

代码语言:javascript
复制
return httpBatchLink({
      url: `${getBaseUrl()}/api`,
      fetch(url, options) {
        return fetch(url, {
          ...options,
          credentials: 'include',
        })
      },
    })

我希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73676124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档