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

TypeScript调用mssql的pool.request报错request不存在于void类型如何解决

问题根因

报错property 'request' does not exists on type 'void'的核心原因是 poolPromise 的返回类型不固定:

  • 数据库连接成功时,poolPromise 返回 sql.ConnectionPool 类型的连接池实例,可正常调用request方法
  • 数据库连接失败时,你写的catch代码块仅打印错误,没有抛出异常,此时poolPromise会返回undefined(TS推断为void类型),自然不存在request属性
    TS无法确定await poolPromise的最终返回类型,因此抛出类型错误。
修复步骤

1. 修改db.ts中poolPromise的异常处理逻辑

不要吞掉连接错误,在catch块中主动抛出异常,同时给poolPromise加明确类型标注,保证返回类型固定为Promise<sql.ConnectionPool>:

import sql from 'mssql/msnodesqlv8'
import dotenv from 'dotenv';
dotenv.config();

const config:sql.config =  {
    user:process.env.SQL_USER,
    password: process.env.SQL_PASSWORD,
    database: process.env.SQL_DBNAME,
    server: process.env.SQL_URL!,
    port: +process.env.SQL_PORT!,
    options: {
        encrypt: false,
    },
}

// 主动加类型标注,避免TS类型推断出错
const poolPromise: Promise<sql.ConnectionPool> = new sql.ConnectionPool(config)
.connect()
.then(pool => {
  console.log('Connected to MSSQL')
  return pool
})
.catch(err => {
  console.log('Database Connection Failed! ', err)
  // 抛出错误,让后续await操作能捕获到异常,不会返回void
  throw err
})
export { sql, poolPromise }

2. 在user.ts中补充导入声明

你当前的user.ts没有导入sql和poolPromise变量,直接调用会导致运行时报错,需要在文件顶部补充导入:

// 路径替换为你项目中db.ts的实际相对路径
import { sql, poolPromise } from './db'

class UserDB {
    async login(username:string,password:string){
        try {
            const pool = await poolPromise
            const result = await pool.request()
            .input('username', sql.NVarChar, username)
            .input('password', sql.NVarChar, password)
            .execute('pwr_loginTenant');

            return  result.recordsets;
            
        } catch (error) {
            console.log('services:user.ts login error',error);
            // 可选:抛出错误让上层调用方也能感知异常
            // throw error
        }
    }
}
const userDB = new UserDB()
// TS项目建议使用ES模块导出规范,替换原有module.exports
export default userDB
可选优化

可以在初始化配置前加环境变量校验,避免因为环境变量缺失导致连接配置不合法:

// db.ts中定义config前加
const requiredEnv = ['SQL_USER', 'SQL_PASSWORD', 'SQL_DBNAME', 'SQL_URL', 'SQL_PORT']
const missingEnv = requiredEnv.filter(key => !process.env[key])
if (missingEnv.length) {
  throw new Error(`缺失必要的数据库环境变量:${missingEnv.join(',')}`)
}

内容的提问来源于stack exchange,提问作者Limor Dryer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:12