Trabajo para una API de Nodejs y este es un archivo de controlador:
import express, { Request, Response } from 'express'; import { ProductStore, Product } from '../models/products'; const store = new ProductStore(); /* export type Product = { id?: number; name: string; price: number; category?: string; }; */ const index = async (_req: Request, res: Response) => { const products = await store.index(); res.json(products); }; const show = async (_req: Request, res: Response) => { const product = await store.show(_req.body.id); res.json(product); }; const productRoutes = (app: express.Application) => { app.get('/products', index); app.get('/products/:id', show); app.post('/products', create); app.delete('/products', destroy); }; export default productRoutes;El archivo del modelo respectivo es:
import client from '../database'; export type Product = { id?: number; name: string; price: number; category?: string; }; export class ProductStore { async index(): Promise<Product[]> { try { // @ts-ignore const conn = await client.connect(); const sql = 'SELECT * FROM products'; const result = await conn.query(sql); conn.release(); return result.rows; } catch (err) { throw new Error(`Could not GET products with error: ${err}`); } } async show(id: number): Promise<Product> { try { const sql = 'SELECT * FROM products WHERE id=($1)'; // @ts-ignore const conn = await client.connect(); const result = await conn.query(sql, [id]); conn.release(); return result.rows[0]; } catch (err) { throw new Error(`Could not find product ${id} with error: ${err}`); } } }Cuando trato de indexar todos los productos, esto funciona bien, pero no puedo buscar solo un producto para mostrar.
La API está aquí en caso de que alguien quiera mirar: https://github.com/Chaklader/StorefrontAPI
La consulta SQL funciona en la terminal de Postgres. ¿Cuál es el problema aquí?
Reemplace su segunda cadena de consulta con esto:
const sql = 'SELECT * FROM products WHERE id=$1';Este problema fue que proporcioné el parámetro con la URL, tendré que extraerlo en consecuencia y no del cuerpo. Este es el código que funciona:
const show = async (_req: Request, res: Response) => { const c = parseInt(_req.params.id); const product = await store.show(c); res.json(product); };Además, la consulta SQL mencionada en la respuesta anterior es incorrecta y se puede usar tal como se proporciona en la pregunta.