ускорьте и призму с помощью хранилища сеансов postgres

#javascript #node.js #postgresql #prisma #fastify

Вопрос:

Я создаю api nodejs, который использует fastify, Prisma и Postgres. У меня есть API, работающий с файлами cookie fastify и сеансом fastify, и я могу получать файлы cookie просто отлично, но мне нужно иметь возможность хранить файлы cookie сеанса в базе данных. Я видел учебник по этому вопросу, но он был без prisma, поэтому я потерял представление о том, как подключить сеанс fastify к пулу баз данных Prisma.

Я использую клиент prisma для подключения к базе данных, чтобы совершать обычные звонки по своим маршрутам, const data = await prisma.model.create({});

server.js

 const fastify = require('fastify')({ logger: true });
const PORT = process.env.PORT || 3000;

// Session state
fastify.register(require('./sessions'));

// Register all our routes here.
...

// Startup code for the fastify server.
const start = async () => {
  try {
    await fastify.listen(PORT, '0.0.0.0');
  } catch (error) {
    fastify.log.error(error);
    process.exit(1);
  }
};

// Start the fastify server.
start();
 

sessions.js

 const cookie = require('fastify-cookie');
const session = require('fastify-session');
const fp = require('fastify-plugin');

/**
 * @param {import('fastify').FastifyInstance} fastify
 */
const plugin = async (fastify) => {
  // All plugin data here is global to fastify.
  fastify.register(cookie);
  fastify.register(session, {
    secret: process.env.SESSION_SECRET,
    store: new SessionStore({
      tableName: 'UserSession',
      pool: ???,   <--------------------------------- how to connect?
    }),
    saveUninitialized: false,
    cookie: {
      httpOnly: true,
      secure: false,
    },
  });

  fastify.addHook('preHandler', (req, reply, next) => {
    req.session.user = {};
    next();
  });
};

module.exports = fp(plugin);
 

Ответ №1:

Если вы хотите использовать пул соединений Prisma, вам придется создать библиотеку хранения сеансов, аналогичную connect-pg-simple кодовой базе, или изменить ее, чтобы принять соединение Prisma. Это определенно нетривиальная реализация, и я не думаю, что это имело бы большой смысл без исключительных обстоятельств.

Я бы предложил создать новый pg.Pool pgPromise экземпляр или и подключиться к нему, как это было показано в учебном видео, на которое вы ссылались. Нет причин, по которым вы не можете открыть два отдельных пула подключений к одной и той же базе данных (один с Prisma и один с pg.Pool).