【问题标题】:Functions that return the previous value of a nodejs typescript variable返回 nodejs 打字稿变量的先前值的函数
【发布时间】:2022-02-08 17:39:59
【问题描述】:

我希望你能帮助我,我有这些路由,当向他们的路由发出请求时,会返回请求的先前值,如果我再次发出请求,它只会显示我请求的数据。

import { BaseProduct, Product } from "./product.interface";
import { Products } from "./products.interface"
import { db } from "../db"
/**
 * query Store
 */


 let products: Products 
/**
 * Service Methods
 */
 export const findAll = async (): Promise<Product[]> => {
   
     db.query('SELECT * FROM bsale_test.product;',(err,results)=>{
      products=Object.values(results)
     })
    return Object.values(products)
};

 export const find = async (id: number): Promise<Product> => {
   db.query(`SELECT * FROM bsale_test.product where id=${id};`,(err,result)=>{
    products=Object.values(result)
   })
  return products[0]
};

因为当您提出请求时 获取 http://localhost:3000/api/products/109 它会显示上一个请求的数据,如果我再次发出请求,它只会显示请求的数据。

{
  "id": 108,
  "name": "PISCO",
  "url_image": "https://dojiw2m9tvv09.cloudfront.net/11132/product/alto8532.jpg",
  "price": 790,
  "discount": 10,
  "category": 2
}

接下来会是什么

{
  "id": 109,
  "name": "PISCO ",
  "url_image": "https://dojiw2m9tvv09.cloudfront.net/11132/product/alto408581.jpg",
  "price": 5990,
  "discount": 0,
  "category": 2
}

我的路线

// GET products
productsRouter.get("/", async (req: Request, res: Response) => {
    try {
      const products: Product[] = await productService.findAll();
  
      res.status(200).send(products);
    } catch (e:any) {
      res.status(500).send(e.message);
    }
  });
// GET products/:id
productsRouter.get("/:id", async (req: Request, res: Response) => {
    const id: number = parseInt(req.params.id, 10);
  
    try {
      const product: Product = await productService.find(id);
  
      if (product) {
        console.log(product)
        return res.status(200).send(product);
      }
      
      res.status(404).send("product not found");
    } catch (e:any) {
      res.status(500).send(e.message);
    }
  });

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    问题是您在计算之前返回值,因此,您返回的是先前计算的值。查看您拥有的代码:

     export const findAll = async (): Promise<Product[]> => {
    
         db.query('SELECT * FROM bsale_test.product;',(err,results)=>{
             products=Object.values(results) // You are assigning the values of products once the db.query completes
         })
        return Object.values(products) // you are returning the value of product instantly, since you are not waiting for db query to finish
    };
    

    相反,您应该返回几个 Promise。这样,在方法完成后,调用 db.query() 的回调后,您将返回所需的值。

    为您的方法尝试以下代码:

    export const findAll = async (): Promise<Product[]> => {
        return new Promise<Product[]>((resolve, reject) => {
            db.query('SELECT * FROM bsale_test.product;', (err, results) => {
                if (err) {
                    reject(err)
                } else {
                    resolve(Object.values(results))
        
                }
            })
        })
    };
    
    export const find = async (id: number): Promise<Product> => {
        return new Promise<Product>((resolve, reject) => {
            db.query(`SELECT * FROM bsale_test.product where id=${id};`,(err, result) => {
                if (err) {
                    reject(err)
                } else {
                    resolve(Object.values(result))
                }
            })
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-12
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2015-08-10
      • 2021-04-10
      • 2017-11-25
      相关资源
      最近更新 更多