/
githubmirror
/
trpc
Обзор
Документация
Войти
/
githubmirror
/
trpc
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
examples/express-server/src/server.ts
135 строк
3 KB
Alex / KATT
chore: remove overzealous destructuring (#6930)
05 сен 2025, 19:46
Не верифицирован
05 сен 2025, 19:46
029196b
Код
Авторство
О чём код?
import { EventEmitter } from 'events'; import { initTRPC, TRPCError } from '@trpc/server'; import * as trpcExpress from '@trpc/server/adapters/express'; import express from 'express'; import { z } from 'zod'; const createContext = ({ req, res, }: trpcExpress.CreateExpressContextOptions) => { const getUser = () => { if (req.headers.authorization !== 'secret') { return null; } return { name: 'alex', }; }; return { req, res, user: getUser(), }; }; type Context = Awaited<ReturnType<typeof createContext>>; const t = initTRPC.context<Context>().create(); const router = t.router; const publicProcedure = t.procedure; // --------- create procedures etc let id = 0; const ee = new EventEmitter(); const db = { posts: [ { id: ++id, title: 'hello', }, ], messages: [createMessage('initial message')], }; function createMessage(text: string) { const msg = { id: ++id, text, createdAt: Date.now(), updatedAt: Date.now(), }; ee.emit('newMessage', msg); return msg; } const postRouter = router({ createPost: t.procedure .input(z.object({ title: z.string() })) .mutation(({ input }) => { const post = { id: ++id, ...input, }; db.posts.push(post); return post; }), listPosts: publicProcedure.query(() => db.posts), }); const messageRouter = router({ addMessage: publicProcedure.input(z.string()).mutation(({ input }) => { const msg = createMessage(input); db.messages.push(msg); return msg; }), listMessages: publicProcedure.query(() => db.messages), }); // root router to call const appRouter = router({ // merge predefined routers post: postRouter, message: messageRouter, // or individual procedures hello: publicProcedure.input(z.string().nullish()).query((opts) => { return `hello ${opts.input ?? opts.ctx.user?.name ?? 'world'}`; }), // or inline a router admin: router({ secret: publicProcedure.query((opts) => { if (!opts.ctx.user) { throw new TRPCError({ code: 'UNAUTHORIZED' }); } if (opts.ctx.user?.name !== 'alex') { throw new TRPCError({ code: 'FORBIDDEN' }); } return { secret: 'sauce', }; }), }), }); export type AppRouter = typeof appRouter; async function main() { // express implementation const app = express(); app.use((req, _res, next) => { // request logger console.log('⬅️ ', req.method, req.path, req.body ?? req.query); next(); }); app.use( '/trpc', trpcExpress.createExpressMiddleware({ router: appRouter, createContext, }), ); app.get('/', (_req, res) => { res.send('hello'); }); app.listen(2021, () => { console.log('listening on port 2021'); }); } void main();