reactjs 在tRPC中处理中间件,为一个路由调用多个方法?

2w2cym1i  于 2023-06-22  发布在  React
关注(0)|答案(1)|浏览(146)

我在做一个小组项目,我们只有几周的时间来完成。我们决定使用T-3堆栈并选择tRPC来构建服务器。我只熟悉express,在学习tRPC方面没有在网上找到太多帮助。我已经有了一些基本的方法,比如在前端调用时从后端返回一个“hello user”。我们的应用程序将连接到用户数据库,比较输入的SQL查询并返回这些查询的指标。
我在后端构建更复杂的路由时遇到了麻烦,我似乎不知道如何在同一个路由器中调用多个中间件。
下面是一个类似应用程序的示例,以及他们的Express服务器在路由和调用不同中间件时的外观:

const router = Router();

// check if database being added is valid
// WIP
router.post(
  '/uri',
  connectController.connectDB,
  connectController.createExtension,
  databaseController.dbStats,
  (req, res) => {
    console.log(res.locals);
    return res.status(200).json(res.locals);
  }
);

// delivers metrics from database
// notice: the database controllers will console log, but not return errors so that individual charts can render
router.post(
  '/queryMetrics',
  connectController.connectDB,
  connectController.createExtension,
  databaseController.queryTimes,
  databaseController.numOfRows,
  databaseController.topCalls,
  databaseController.dbStats,
  databaseController.cacheHitRatio,
  databaseController.statActivity,
  (req, res) => {
    return res.status(200).json(res.locals.result);
  }
);

这是我的tRPC路由器的开始,我如何以上面的例子使用中间件和路由器的方式为同一个路由调用多个方法?

export const exampleRouter = createTRPCRouter({
  hello: publicProcedure
    .input(z.object({ text: z.string() }))
    .query(({ input }) => {
      return {
        greeting: `Hello ${input.text}`,
      };
    }),

  getAll: publicProcedure.query(async ({ ctx }) => {
    
    // return ctx.prisma.user.findMany();

    console.log(ctx.session)
    const users = await ctx.prisma.user.findMany();
    const names = users.map(user => user.name);
    return names;
    
  }),

  getSecretMessage: protectedProcedure.query(() => {
    return "you can now see this secret message!";
  }),

  connectToUserDb: protectedProcedure
    .input(z.object({ URI: z.string() }))
    .query( ({input, ctx}) => {
      const pool = new Pool({
        connectionString: input.URI
      });

      pool.query('SELECT NOW()', (error, result) => {
        if (error) {
          console.error('Error executing query:', error);
          return;
        }
      
        console.log('Connection to "postgres" database successful');
        console.log('Current timestamp:', result.rows[0].now);
      });

      ctx.dbConnection = pool;
})

在本例路由器上,我如何设计一条调用这些方法的路由?你认为我们应该继续使用tRPC,还是最好切换到express来完成项目?

eufgjt7s

eufgjt7s1#

您需要从所需的每个不同过程中提取逻辑。这是trpc的一个维护者推荐的,因为不推荐从其他过程调用trpc过程。
Here's一个视频,围绕链接的时间戳,他开始使用下面的这种分离方法。可能似乎不是最好的分离出来,因为你是在你的项目早期,但一旦你有多个路由器,你需要能够从其他路由器获取信息,你会开始看到的好处。
我也会推荐加入trpc的不和谐和西奥的不和谐和搜索在他们两个,帮助了我一吨。

const helloLogic = () => {
     greeting: `Hello ${input.text}`,
};

const getAllLogic = async ({ prisma }) => {
     console.log(ctx.session)
     const users = await ctx.prisma.user.findMany();
     const names = users.map(user => user.name);
     return names;
};

export const exampleRouter = createTRPCRouter({
  hello: publicProcedure
   .input(z.object({ text: z.string() }))
   .query(({ input }) => {
    return helloLogic();
  }),
  getAll: publicProcedure.query(async ({ ctx }) => {
    return await getAllLogic()),
  }),

  // ** Everything you need procedure **
  callAllMethods: publicProcedure.query(async ({ ctx }) => {
    return {
     hello: helloLogic(),
     users: await getAllLogic()
     // Whatever else you need to call
    }
  })
})

相关问题