I’m trying to integrate Drizzle ORM into my Fastify application as a plugin using TypeScript. Despite following the provided documentation and examples, I’m encountering issues accessing the Drizzle instance within my request handlers. Here’s my plugin implementation:
import fp from "fastify-plugin";
import { FastifyInstance, FastifyPluginOptions } from "fastify";
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
const drizzlePlugin = fp(
async (fastify: FastifyInstance, options: FastifyPluginOptions) => {
const databaseUrl = fastify.config.DATABASE_URL;
const queryClient = postgres(databaseUrl);
const Drizzle = drizzle(queryClient);
fastify.decorate("drizzle", Drizzle);
try {
await queryClient`SELECT 1`; // Simple query to check the connection
fastify.log.info("Database connected successfully.");
} catch (error) {
fastify.log.error("Failed to connect to the database: ", error);
throw error; // Optionally rethrow to handle the error further or fail the plugin registration
}
fastify.addHook("onClose", (instance, done) => {
instance.drizzle.close(); // Adjust based on actual API to close connections
done();
});
},
{ name: "drizzle-orm", dependencies: [] }
);
export default drizzlePlugin;
That’s my fastify.d.ts file:
import "fastify";
import { Drizzle } from "@drizzle-orm/core";
declare module "fastify" {
interface FastifyInstance {
authenticate: (
request: FastifyRequest,
reply: FastifyReply
) => Promise<void>;
config: {
JWT_SECRET: string;
COOKIE_NAME: string;
PORT: number;
HOST: string;
COOKIE_SECRET: string;
DATABASE_URL: string;
};
drizzle: Drizzle;
}
interface FastifyRequest {
user?: { id: string; email: string };
}
}