Search code examples
node.jsjsonpostgresqlselectpg-promise

postgres SELECT query returns unusable result


I have a simple SELECT query that is returning an unusable result. I am using pg-promise in node.js

[
  {
    "function_name": "(f10d1988-4db5-49de-97ab-0c8b15bedfa7,image.jpg,Image)"
  },
  {
    "function_name": "(f10d1988-4db5-49de-97ab-0c8b15bedfa7,image2.jpg,Image 2)"
  }
]

but I was expecting a basic json structure like

[
  {
    id: '',
    title: '',
    image: ''
  },
  {...etc}
]

Why is it doing this? How do I get a normalized result?

My query looks like the below:

CREATE OR REPLACE FUNCTION get_photos(
  title_param     TEXT
)
RETURNS TABLE(
  id         UUID,
  image      varchar(200),
  title      varchar(200) 
) AS
$func$
BEGIN
  RETURN QUERY SELECT
    i.id,
    i.image,
    i.title
  FROM images AS i
  WHERE i.title = title_param;
END;
$func$ LANGUAGE PLPGSQL;

Here is my db conenctor setup, almost all defaults.

require('dotenv').config();
const Promise = require('bluebird');
const pg = require('pg-promise')({
  promiseLib: Promise
});

const config = {
  user: process.env.USER,
  host: process.env.HOST,
  database: process.env.DATABASE,
  password: process.env.PASSWORD
};

const db = pg(config);

export default db;

Here is the express endpoint that is calling the function:

export const getData = async (req, res) => {
  const { title } = req.query;
  let data;
  try {
    data = await db.many('SELECT function_name($1)', [title]);
  } catch (err) {
    data = err;
  }
  res.send(data);
};

EDIT

I ran the query manually instead of through a function and the data returned correctly which means that there is an issue with my TABLE() return. What could possibly cause this issue?

images = await db.many(`
  SELECT
    p.id,
    p.img,
    p.type,
    p.title
  FROM photos p
  WHERE p.type = '${type}';
`, [type]);

Solution

  • Use func as the query method:

    data = await db.func('function_name', [title]);
    

    It assumes you return a table, and so will work for you by default.

    And for stored procedures, there's proc method.


    Also, your parameter formatting for the images query is wrong, see Named Parameters:

    IMPORTANT: Never use the reserved ${} syntax inside ES6 template strings ...