1

I'm new to nextjs and I'm creating API on next.js to perform db update using the pg-promise. However, it always hit the WARNING: Creating a duplicate database object for the same connection on console when the app is calling the API.

I tried browsing the docs but couldn't find a solution. I also tried solution (update-2) mentioned on stackoverflow page below, but the warning still exists.
Where should I initialize pg-promise

I think the problem is on the method I used to set the columnset. However I can't find proper way to do it. How should I fix it with pg-promise ?

Db setting code:

import ConfigEnv from 'utils/configuration';
import * as pgLib from 'pg-promise';

const initOptions = {
    capSQL: true,
};

const pgp =  require('pg-promise')(initOptions);

interface IDatabaseScope {
    db: pgLib.IDatabase<any>;
    pgp: pgLib.IMain;
}

export function createSingleton<T>(name: string, create: () => T): T {
    const s = Symbol.for(name);
    let scope = (global as any)[s];
    if (!scope) {
        scope = {...create()};
        (global as any)[s] = scope;
    }
    return scope;
}

export function getDB(): IDatabaseScope {
    return createSingleton<IDatabaseScope>('my-app-db-space', () => {
        return {
            db: pgp(ConfigEnv.pgp),
            pgp
        };
    });
}

API code:

import {getDB} from 'db/pgpdb';
const {db, pgp} = getDB();

const cs = new pgp.helpers.ColumnSet([
  '?detail_id',
  'age',
  'name'
  // 'last_modified_date',
], {
      table: 'user_detail',
})

export default async (req, res) => {
  try {
    // generating the update query where it is needed:
    const update =  pgp.helpers.update(req.body.content, cs) + ` WHERE v.detail_id = t.detail_id`;

    // executing the query
    await db
      .none(update)
      .then(() => {
        return res.status(200).end();
      })
      .catch((error) => {
        console.log('error', error);
        return res.status(500).send(error);
      });
  } catch (error) {
    console.log(error);
  }
};
juliomalves
  • 42,130
  • 20
  • 150
  • 146
Jack
  • 79
  • 1
  • 8

0 Answers0