You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express+TypeScript插入数据后查询结果未实时更新问题求助

问题解决:插入数据后查询未更新 + DB操作优化

一、查询结果不更新的核心原因

  1. 查询结果被缓存:doctorServices.ts中getEntriesdb是模块加载时就执行的SQL查询,后续调用复用的是首次查询的旧结果,并非实时查询数据库。
  2. 异步操作未等待: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:42:48