--- title: Connect a NestJS application to Neon subtitle: Set up a Neon project in seconds and connect from a NestJS application enableTableOfContents: true updatedOn: '2025-10-24T12:48:41.461Z' --- NestJS is a framework for building efficient, scalable Node.js server-side applications1. This guide explains how to connect NestJS with Neon using a secure server-side request. To create a Neon project and access it from a NestJS application: ## Create a Neon project If you do not have one already, create a Neon project. Save your connection details including your password. They are required when defining connection settings. 1. Navigate to the [Projects](https://console.neon.tech/app/projects) page in the Neon Console. 2. Click **New Project**. 3. Specify your project settings and click **Create Project**. ## Create a NestJS project and add dependencies 1. Create a NestJS project if you do not have one. For instructions, see [Quick Start](https://docs.nestjs.com/first-steps), in the NestJS documentation. 2. Add project dependencies using one of the following commands: ```shell npm install pg ``` ```shell npm install postgres ``` ```shell npm install @neondatabase/serverless ``` ## Store your Neon credentials Add a `.env` file to your project directory and add your Neon connection string to it. You can find your connection details by clicking **Connect** on the Neon **Project Dashboard**. For more information, see [Connect from any application](/docs/connect/connect-from-any-app). ```shell shouldWrap DATABASE_URL="postgresql://:@.neon.tech:/?sslmode=require&channel_binding=require" ``` ## Configure the Postgres client ### 1. Create a Database Module To manage the connection to your Neon database, start by creating a **DatabaseModule** in your NestJS application. This module will handle the configuration and provisioning of the Postgres client. ```typescript import { config } from 'dotenv'; import { Module } from '@nestjs/common'; import pg from 'pg'; // Load Environment Variables config({ path: ['.env', '.env.production', '.env.local'], }); const sql = new pg.Pool({ connectionString: process.env.DATABASE_URL }); const dbProvider = { provide: 'POSTGRES_POOL', useValue: sql, }; @Module({ providers: [dbProvider], exports: [dbProvider], }) export class DatabaseModule {} ``` ```typescript import { config } from 'dotenv'; import { Module } from '@nestjs/common'; import postgres from 'postgres'; // Load Environment Variables config({ path: ['.env', '.env.production', '.env.local'], }); const sql = postgres(process.env.DATABASE_URL, { ssl: 'require' }); const dbProvider = { provide: 'POSTGRES_POOL', useValue: sql, }; @Module({ providers: [dbProvider], exports: [dbProvider], }) export class DatabaseModule {} ``` ```typescript import { config } from 'dotenv'; import { Module } from '@nestjs/common'; import { neon } from '@neondatabase/serverless'; // Load Environment Variables config({ path: ['.env', '.env.production', '.env.local'], }); const sql = neon(process.env.DATABASE_URL); const dbProvider = { provide: 'POSTGRES_POOL', useValue: sql, }; @Module({ providers: [dbProvider], exports: [dbProvider], }) export class DatabaseModule {} ``` ### 2. Create a Service for Database Interaction Next, implement a service to facilitate interaction with your Postgres database. This service will use the database connection defined in the DatabaseModule. ```typescript import { Injectable, Inject } from '@nestjs/common'; @Injectable() export class AppService { constructor(@Inject('POSTGRES_POOL') private readonly sql: any) {} async getTable(name: string): Promise { const client = await this.sql.connect(); const { rows } = await client.query(`SELECT * FROM ${name}`); return rows; } } ``` ```typescript import { Injectable, Inject } from '@nestjs/common'; @Injectable() export class AppService { constructor(@Inject('POSTGRES_POOL') private readonly sql: any) {} async getTable(name: string): Promise { return await this.sql(`SELECT * FROM ${name}`); } } ``` ```typescript import { Injectable, Inject } from '@nestjs/common'; @Injectable() export class AppService { constructor(@Inject('POSTGRES_POOL') private readonly sql: any) {} async getTable(name: string): Promise { return await this.sql(`SELECT * FROM ${name}`); } } ``` ### 3. Integrate the Database Module and Service Import and inject the DatabaseModule and AppService into your AppModule. This ensures that the database connection and services are available throughout your application. ```typescript import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { DatabaseModule } from './database/database.module'; @Module({ imports: [DatabaseModule], controllers: [AppController], providers: [AppService], }) export class AppModule {} ``` ### 4. Define a Controller Endpoint Finally, define a `GET` endpoint in your AppController to fetch data from your Postgres database. This endpoint will use the AppService to query the database. ```typescript import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller('/') export class AppController { constructor(private readonly appService: AppService) {} @Get() async getTable() { return this.appService.getTable('playing_with_neon'); } } ``` ## Run the app When you run `npm run start` you can expect to see output similar to the following at [localhost:3000](localhost:3000): ```shell shouldWrap [{"id":1,"name":"c4ca4238a0","value":0.39330545},{"id":2,"name":"c81e728d9d","value":0.14468245}] ``` ## Source code You can find the source code for the application described in this guide on GitHub. Get started with NestJS and Neon