Express+TypeScript插入数据后查询结果未实时更新问题求助
问题解决:插入数据后查询未更新 + DB操作优化
一、查询结果不更新的核心原因
- 查询结果被缓存:
doctorServices.ts中getEntriesdb是模块加载时就执行的SQL查询,后续调用复用的是首次查询的旧结果,并非实时查询数据库。 - 异步操作未等待:
addEntrydb的插入是异步操作,但路由中未等待插入完成就执行查询,导致查询可能先于插入完成。
二、分步修复方案
1. 修改 doctorServices.ts
将查询改为函数式调用,确保每次查询都是实时请求;同时让插入操作返回Promise,支持等待执行完成:
import { query } from './db' // 改为函数,每次调用执行实时查询 export const getEntriesdb = () => query(`SELECT name, lastname, specialty, consultory, email FROM doctors`, []) export const addEntrydb = (name:string, lastname: string, Specialty: string, Consultory: number, Email: string) =>{ // 返回插入操作的Promise,让调用方可等待完成 return query( "INSERT INTO doctors(name, lastname, specialty, consultory, email) VALUES (?,?,?,?,?)", [name, lastname, Specialty, Consultory, Email] ) }
2. 修改 router.ts
使用async/await替代.then(),确保插入完成后再查询最新数据:
import express from "express"; import { Request, Response } from 'express'; import { validationResult } from 'express-validator'; import * as doctorServices from '../services/doctorServices' const router = express.Router() // 路由处理函数改为async,支持await语法 router.post('/', toNewDoctorEntry, async (req: Request, res: Response)=>{ const errors = validationResult(req) if (!errors.isEmpty()){ const result = await doctorServices.getEntriesdb(); res.render("doctors", {"doctorlist":result, errors:errors.array()}) console.log(errors.array()) return } else { const { nameInput, lastnameInput, specialtyInput, consultoryInput, emailInput } = req.body; // 等待插入操作完成 await doctorServices.addEntrydb(nameInput, lastnameInput, specialtyInput, consultoryInput, emailInput) // 插入完成后查询最新数据 const result = await doctorServices.getEntriesdb(); res.render("doctors", {"doctorlist":result, 'success':"success"}) } }) export default router
三、优化 db.ts 的查询函数
当前每次查询都创建新连接,性能低下。改用连接池复用连接,同时简化代码:
import mysql from "mysql2/promise"; import { config } from "../database/connect" // 创建连接池,自动管理连接复用 const pool = mysql.createPool(config); export async function query(sql: string, params: any[]) { // 使用execute替代query,更安全(自动处理参数转义) const [results] = await pool.execute(sql, params); return results; }
优化点:
- 连接池避免频繁创建/销毁连接的开销
execute方法更安全,防止SQL注入- 代码更简洁,无需手动管理连接生命周期
额外优化建议
- 给
req、res添加精确的TypeScript类型(如Request、Response),提升类型安全性 - 定义
Specialty枚举或类型,替代当前的any类型 - 统一变量命名规范(如
Specialty改为小写开头specialty,与数据库字段保持一致)
内容的提问来源于stack exchange,提问作者darc33
相关产品推荐
相关产品推荐

